反应将数据发送到父组件

时间:2017-04-24 14:33:31

标签: javascript json reactjs components

我从API subcomponent加载分页消息,并将jsonData发送给父component以处理向UI显示消息。我用以下代码成功实现了这一点,但我被告知我的设计和数据传递是有问题的 - 特别是在我的MoreMessages组件中。

有人看到我的尝试有什么问题吗?

MoreMessages.js

/ * 在子组件中,我只是渲染一个按钮,当它被单击时,我获取消息并使用self.props.setMessages(jsonData)将数据发送到父组件 * /

export default class MoreMessages extends React.Component {
  constructor() {
    super()
    this.state = {
      pages: 1
    }
  }

  handleClick() {
    var self = this

    this.setState({ pages: this.state.pages+1 }, () => {
      var url = process.env.URL+'?page='+this.state.pages
      const fetchMessages = fetch(url, {credentials: 'same-origin'})

      function loadMyMessages(data) {
        data.json().then((jsonData) => {
          console.log("Sending the jsonData to props in Layout component");
          self.props.setMessages(jsonData)
        })
      }

      fetchMessages.then(loadMyMessages)
    });
  }

  render() {
    return (
      <div id="more-messages">
        <button onClick={this.handleClick.bind(this)}>More Messages</button>
      </div>
    )
  }
}

Layout.js

/ *然后只需使用setMessages方法将数据传递给父组件,该方法更新消息状态,MessageList组件更新UI * /

export default class Layout extends React.Component {
  constructor() {
    super()
    this.state = {
      messages: []
    }
  }

  componentWillMount() {
      var self = this
      const fetchMessages = fetch(process.env.URL, {credentials: 'same-origin'})

      function loadMyMessages(data) {
        data.json().then((jsonData) => {
          self.setMessages(jsonData)
        })
      }

      fetchMessages.then(loadMyMessages)
    }

    setMessages(data) {
      var messageArr = []
      data.messages.map((r) => {
        messageArr.push(r)
      })

      this.setState({
        messages: this.state.messages.concat(messageArr),
      })
    }

  render() {
    return (
      <div id="componentLayout">
            <MessageList messages={this.state.messages}/>
            <MoreMessages setMessages={this.setMessages.bind(this)} />
      </div>
    )
  }
}

这种设计有什么不对或不推荐吗?

1 个答案:

答案 0 :(得分:3)

Layout组件中执行此操作:

export default class Layout extends React.Component {
    constructor(props) {
        super(props)

        // ...

        this.setMessages = this.setMessages.bind(this);
        this.handleLoadMore = this.handleLoadMore.bind(this);
  }

  // ...

  handleLoadMore() {
      // your call to retrieve more data
  }

  render() {
      return (
          <div id="componentLayout">
              <MessageList messages={this.state.messages}/>
              <MoreMessages
                  setMessages={this.setMessages}
                  onLoadMore={this.handleLoadMore} />
           </div>
       );
    }
}

MoreMessages组件中,您现在可以执行以下操作:

render() {
    return (
        <div id="more-messages">
            <button onClick={this.props.onLoadMore}>More Messages</button>
        </div>
    );
}