【问题标题】:Meteor-React: How to re-render on a state inside setState after Meteor.call callback finishes?Meteor-React:如何在 Meteor.call 回调完成后重新渲染 setState 内的状态?
【发布时间】:2017-07-30 00:29:40
【问题描述】:

活动摘要:
我点击编辑按钮。
editForm() 在 render() 中使用 this.setState() 和 this.state 显示表单。
上面的 setState() 将 {this.state} 作为我需要显示的值。
一旦我单击表单内的更新按钮,updateMessage() 就会激活,其中 Meteor.call 包含一个回调选项。
这个回调函数有 this.setState() 连接到我上面提到的那个 {this.state}。

那么如何在 Meteor.call() 回调和 setState() 之后显示 {this.state}?

-note- 将 {this.state} 放入 render() 将在回调后显示。

代码如下:this.state.show_error_or_noerror 里面的 editMessage() 是我需要显示的。

constructor(props) {
super(props);

    const messageContent = this.props.messageContent;
    const username = this.props.username;
    const articleTitle = this.props.articleTitle;

    this.state = {
      show_error_or_noerror: '',
      messageContent: messageContent,
      username: username,
      articleTitle: articleTitle
    };

    this.editMessage = this.editMessage.bind(this);
    this.updateMessage = this.updateMessage.bind(this);

  }
  updateMessage(event) {
    event.preventDefault();

    const messageId = this.props.messageId;
    const messageContent = this.refMessage.value.trim();

    Meteor.call('message.update', messageId, messageContent, (error) => {
      if(error) {
        this.setState({show_error_or_noerror: error.reason});
      } else {
        this.setState({show_error_or_noerror: 'Updated successfully.'});
      }
    });
  }
  editMessage(event) {
    event.preventDefault();

    const messageId = this.props.messageId;

    this.setState({
      ['show_form'+messageId]: <form onSubmit={this.updateMessage}>
        <textarea
          ref={(textarea) => {this.refMessage = textarea;}}
          defaultValue={this.state.messageContent}
        />
        <h6>by {this.state.username}</h6>
        <h6>Article: {this.state.articleTitle}</h6>
        <button type="submit">Update</button>
        <button onClick={this.hideForm}>Hide</button>
        {this.state.show_error_or_noerror}
      </form>
    });
  }
  render() {
    const messageId = this.props.messageId;

    return (
      <span className="message_updator">
        <button onClick={this.editMessage}>Edit</button>
        {this.state['show_form'+messageId]}
      </span>
    )
  }
}

【问题讨论】:

    标签: javascript reactjs meteor meteor-react meteor-methods


    【解决方案1】:

    要在流星中实现反应性,请创建一个 Tracker.dependency 对象并让您的渲染依赖它 (ref)。

    在构造函数中创建依赖项

    var dep = new Tracker.Dependency;
    

    让你的渲染依赖它

    dep.depend();
    

    在你的 setState 函数中调用它

    dep.changed();
    

    【讨论】:

    • 我将dep = new Tracker.Dependency; 作为构造函数中的全局变量。
      我把dep.depend(); 放在render() 里面。
      我将dep.changed() 放在if else 的Meteor.call 回调语句中。
      注意改变了。
    • 我认为问题在于 Meteor.call 设计为只运行一次。这是用于响应流星调用的两个包meteor-reactive-method 和meteor-call
    • 我删除了Meteor.call(),只使用了this.setState()。它仍然没有重新渲染,所以这不是 Meteor 问题。我使用 react 修复了它。
    猜你喜欢
    • 2017-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2019-08-04
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多