我试图更好地理解键在React组件中的作用。我已经读了很多书,但是我看到的每个示例(例如React docs或the great explanation on S.O.中的示例)都假定进入组件的数据是动态的。
所有示例都将键应用于具有数组索引值或使用.map()
之类的键来动态地将数据库ID分配给子组件的每个实例,并满足React对键的需求。
我的示例在一个静态站点上,静态内容进入子组件,该子组件被调用了两次。尽我所能,我可以创建一个随机数生成器函数getRandomInt
并以此方式应用密钥。
不幸的是,这导致了熟悉的React错误:
数组或迭代器中的每个子代都应具有唯一的“键”道具。 检查
CaseStudyOpinionSummary
的渲染方法。它通过了DiagnosticCaseStudy
的孩子。
我要去哪里错了?
父项(DiagnosticCaseStudy
)
import React from 'react'
import CaseStudyOpinionSummary from '../../../components/CaseStudyOpinionSummary'
export default class DiagnosticCaseStudy extends React.Component {
getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min
}
render() {
return (
<CaseStudyOpinionSummary
part="Part One"
partTitle="Diagnosis"
partSubtitle="Primary Care Encounter"
partSummary="Short brief"
key={ this.getRandomInt(0, 100000) }
/>
<CaseStudyOpinionSummary
part="Part Two"
partTitle="Medication and Management"
partSubtitle="Initial Gastroenterologist Encounter"
partSummary="Another short brief"
key={ this.getRandomInt(0, 100000) }
/>
)
}
子组件(CaseStudyOpinionSummary
)
import React from 'react'
export default class CaseStudyOpinionSummary extends React.Component {
render() {
return (
<div>
<section className="lightest-gray-bg">
<section className="aga-cs-container-short">
<section className="aga-container">
<h2 className="aga-cs-orange-title">{[this.props.part, ": ", this.props.partTitle ]}</h2>
<h2 className="aga-cs-question-title">{ this.props.partSubtitle }</h2>
{ this.props.partSummary }
</section>
</section>
</section>
</div>
)
}
}
答案 0 :(得分:1)
React只需要key
属性就可以区分数组中的同级组件。您不需要key
道具来支持常规的兄弟元素。
class AppWithArray extends React.Component {
render() {
return (
<div>
{[
<div key="1"> test1 </div>,
<div key="2"> test2 </div>
]}
</div>
);
}
}
class AppWithoutArray extends React.Component {
render() {
return (
<div>
<div> test3 </div>
<div> test4 </div>
</div>
);
}
}
ReactDOM.render(
<div>
<AppWithArray />
<AppWithoutArray />
</div>,
document.getElementById("root")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
当组件获得新的key
道具时,旧的道具将被卸载并丢弃,新的道具将被创建并安装。您几乎永远不会在数组之外使用key
道具,但是如果您需要创建一个全新的组件,可以牢记这是一个不错的技术。
class Timer extends React.Component {
timer = null;
state = { count: 0 };
componentDidMount() {
this.timer = setInterval(() => {
this.setState(prevState => ({ count: prevState.count + 1 }));
}, 1000);
}
componentWillUnmount() {
clearInterval(this.timer);
}
render() {
return <div>{this.state.count}</div>;
}
}
class App extends React.Component {
state = { timerKey: 1 };
componentDidMount() {
setTimeout(() => {
this.setState({ timerKey: 2 });
}, 5000);
}
render() {
return <Timer key={this.state.timerKey} />;
}
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>