我对React JS组件中的关键道具有问题。
我正在得到
警告:数组或迭代器中的每个子级都应具有唯一的“键”属性。检查登录的呈现方法。从应用程序中传递了一个孩子。
控制台日志中的警告。应用程序组件如下:
import React from 'react';
import Header from '../common/header';
import HeaderCompact from '../common/headerCompact';
import Footer from '../common/footer';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
lang: 1
};
}
changeLang(name, event) {
event.preventDefault();
switch (name) {
case "fra" :
this.setState({lang: 2});
break;
case "ger" :
this.setState({lang: 3});
break;
case "ned" :
this.setState({lang: 4});
break;
default:
this.setState({lang: 1});
}
}
render() {
let currentRoute = this.props.location.pathname.slice(1);
let header = currentRoute === "" ? <Header onClick={this.changeLang} lang={this.state.lang}/> :
<HeaderCompact currentRoute={currentRoute} onClick={this.changeLang} lang={this.state.lang}/>;
return (
<div>
{header}
{React.cloneElement(this.props.children, {lang: this.state.lang})}
<Footer lang={this.state.lang}/>
</div>
);
}
}
export default App;
我的登录组件如下:
import React from 'react';
import LoginForm from './loginForm';
const Login = ({currentLanguage}) => {
const language = currentLanguage;
return (
<div className="container">
<div className="row">
<p className="col-lg-4 col-xs-12 col-md-4 loginTitle noPadding">{language.loginTitle}</p>
<div className="col-lg-8 col-xs-12 col-md-8 loginForm noPadding">
<LoginForm currentLanguage={language}/>
</div>
</div>
</div>
);
};
export default Login;
我对React还是个新手,我不确定我应该像钥匙一样传递什么,在哪里传递?
使现代化
LoginForm组件:
import React from 'react';
import {Link} from 'react-router';
import TextInput from '../../common/formElements/textInput';
import LoginButton from '../../common/formElements/button';
class LoginForm extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
loginData: {
username: '',
password: ''
},
errors: {}
};
this.buttonClickHandle = this.buttonClickHandle.bind(this);
this.loginHandle = this.loginHandle.bind(this);
}
loginHandle(event) {
let field = event.target.name;
let value = event.target.value;
this.state.loginData[field] = value;
return this.setState({loginData: this.state.loginData});
}
buttonClickHandle(event) {
event.preventDefault();
alert("It's clicked/n");
}
render() {
const language = this.props.currentLanguage;
return (
<div className="contact_form">
<form role="form" action="" method="post" id="contact_form">
<div className="col-lg-4 col-md-4 col-sm-4 col-xs-12 smScrPdLeft" style={{marginTop: 5}}>
<TextInput
type="text"
name="username"
label=""
placeholder={language.loginUsername}
className="templateInput loginUsername col-lg-12 col-md-12 col-sm-12 col-xs-12"
id="name"
sizeClass=""
onChange={this.loginHandle}
value={this.state.username}
errors={this.state.errors.username}
/>
</div>
<div className="col-lg-4 col-md-4 col-sm-4 col-xs-12 smPadding" style={{marginTop: 5}}>
<TextInput
type="password"
name="password"
label=""
placeholder={language.loginPassword}
className="templateInput loginPassword col-lg-12 col-md-12 col-sm-12 col-xs-12"
id="password"
sizeClass=""
onChange={this.loginHandle}
value={this.state.password}
errors={this.state.errors.password}
/>
<Link to="/" className="forgotPassLabel">{language.forgotPassword}</Link>
</div>
<div className="col-lg-4 col-md-4 col-sm-4 col-xs-12 btnLogin noPadding smScrPdRight" style={{marginTop: 4}}>
<LoginButton onClick={() => this.buttonClickHandle(event)} name="registration" value={language.loginBtnText} className="rightFloat" icon="user"/>
</div>
</form>
</div>
);
}
}
export default LoginForm;
路由文件:
import React from 'react';
import { IndexRoute, Route } from 'react-router';
import App from './components/App';
import HomePage from './components/HomePage';
const routes = (
<Route path="/" component={App}>
<IndexRoute component={HomePage}/>
</Route>
);
export default routes;
主页组件
return (
<div>
<div className="sidebar-menu-container" id="sidebar-menu-container">
<div className="sidebar-menu-push">
<div className="sidebar-menu-overlay"></div>
<div className="sidebar-menu-inner">
<section className="marginOnXs" style={{width: '100%', padding: 0}}>
<div className="container">
<div className="row hideOnXS">
<MainSlider />
</div>
</div>
</section>
<div id="cta-1" className="onlyOnDesktop">
<Login currentLanguage={languageHome}/>
</div>
<section className="why-us" style={{paddingTop: 0}}>
<Info currentLanguage={languageHome}/>
</section>
<div className="clearfix"></div>
<section className="featured-listing">
<CarsList allCars={carsList()} currentLanguage={languageHome}/>
</section>
<section className="contactSection">
<ContactForm currentLanguage={languageHome}/>
</section>
</div>
</div>
</div>
</div>
);
此警告背后的原因是您尚未传递“key”属性。React使用此属性优化渲染过程,如React中的某些内容发生更改时,将仅对所有已更改的内容进行重新渲染。
如果我们的孩子是动态的,如果他们被随机函数洗牌,或者在数组开始时引入了新的组件,那么重新渲染很可能会搞砸。因此,分配这个“key”属性有助于我们确保组件的状态和标识通过多个渲染来维护。请在下面找到演示如何传递密钥的示例代码段。
<MyComponent key={{item.key}}/>
这里很好地解释了键的重要性。
我不知道您的LoginForm
组件是什么样子。
但是每次迭代数组时,您都必须将key
prop设置为每个生成的DOM
元素,因为React
需要它来优化重新渲染。例如:
<div className="container">
{myarray.map((element, index) => {
return <div key={'mykey' + index}>{element}</div>;
})}
</div>
例如,React
将检测重复项,并仅使用此键呈现第一个
节点
。
我完全糊涂了,因为我的控制台有错误,我阅读了reactjs文档和有关stackoverflow的所有提示,但我无法理解问题是什么。我看到了书的标题列表({item.volumeInfo.title}),但控制台有错误。 这是我的密码: 这是API响应的一部分: 我试着做下一个键: key={item.etag}, key={i}, key={item.volumenfo.title} 但错误仍然存
我对reatjs非常陌生,我试图将数据发布到url,但收到RequestNotFound 500错误,我使用调试器看到了这一点 警告:数组或迭代器中的每个子级都应该有一个唯一的“键”道具。检查的渲染方法。 请帮我摆脱这一切 我正在从url获取数据,但我无法发布数据 请检查它,并更正我的代码与解释
我收到3条警告: 警告:数组或迭代器中的每个子节点都应该在ModalBody的div(由ModalBody创建)中的表中具有唯一的key prop。 警告:数组或迭代器中的每个孩子都应该有一个唯一的"key"prop. in tr in thead in table 警告:数组或迭代器中的每个子节点都应该有一个唯一的"key"prop. in tr in tbody in table 我有一个函数
但这是错误的: 我不知道如何插入“钥匙”
我是新手,我正在编写一个包含卡片的应用程序平面列表,但我发现这个错误,这是我的代码 但是我得到警告:列表中的每个孩子都应该有一个独特的“钥匙”道具。有关更多信息,请参见https://fb. me/react-warge-key。%s, 我做错了什么?
我试图显示一个从服务器获取数据并显示其中所有信息的表。代码正在从获取的API打印我的表标题和第一个对象的信息。 这给了我一个错误。 警告:数组或迭代器中的每个子级都应具有唯一的“键”属性。检查的渲染方法