React.js,在DOM中进行迭代的正确方法

时间:2018-08-19 23:16:18

标签: reactjs ecmascript-6 state-saving

我是ReactJS的新手...

我有一个具有以下类组件结构的项目:

index.js
  --app
    --chat
  --header
  --left
  --right

在chat.js组件中,我使用api进行了google搜索,以根据特定的关键字检索图像...我的直观解决方案是:

this.client.search("cars")
                .then(images => {
                    for(let el of images) {
                    ReactDOM.render(<img src="{{el.url}}" syle="{{width: '100%'}}" />, document.querySelector('#gimages'));
                    }
                });

对吗?还是我可以使用带有通量(redux)的存储状态的组件?

2 个答案:

答案 0 :(得分:1)

也许更简单的常规使用react可以满足您的需求?

您可以遵循与以下所示类似的模式,以更“类似于反应”的方式实现所需的条件:

class Chat extends React.Component {

  constructor(props) {
    super(props)
    this.state = { images : [] } // Set the inital state and state
                                 // model of YourComponent
  }

  componentDidMount() {

    // Assume "client" has been setup already, in your component

    this.client.search("cars")
    .then(images => {

      // When a search query returns images, store those in the
      // YourComponent state. This will trigger react to re-render 
      // the component
      this.setState({ images : images })
    });
  }

  render() {

    const { images } = this.state

    // Render images out based on current state (ie either empty list, 
    // no images, or populated list to  show images)
    return (<div>
        { 
          images.map(image => {
              return <img src={image.url} style="width:100%" />
          })
        }
    </div>)
  }

}

请注意,这不是完整的代码示例,将需要您“填补空白”以使用当前聊天组件中的所有其他内容(例如,设置this.client

答案 1 :(得分:1)

这不是您应该采取的方式,您无需为每个项目使用ReactDOM.render。实际上,您根本不需要使用ReactDOM.render。在组件中,您可以使用生命周期方法来获取数据,然后将其设置为本地状态。获取数据后,您可以将其传递到单个组件或直接在render方法中呈现。

class Chat extends React.Component {
  state = {
    images: [],
  }

  componentDidMount() {
    this.client.search( "cars" )
      .then( images => this.setState( { images } ) );
  }

  renderImages = () =>
      this.state.images.map( image => <Image key={image.id} image={image} /> );

  render() {
    return (
      <div>{this.renderImages()}</div>
    );
  }
}

const Image = props => (
  <div>
    <img src={props.image.url} syle="{{width: '100%'}}" />
  </div>
);

此时,您不需要Redux或其他任何东西。但是,如果您需要打开许多组件的状态,则可以考虑使用。另外,习惯使用mapfilter之类的方法来代替for循环。