调用静态子组件时定义React Prop键

时间:2018-08-06 16:24:50

标签: javascript reactjs random

我试图更好地理解键在React组件中的作用。我已经读了很多书,但是我看到的每个示例(例如React docsthe 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>
    )
  }
}

1 个答案:

答案 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>