【问题标题】:Having a component re-render on button press in React在 React 中按下按钮时重新渲染组件
【发布时间】:2020-09-02 20:15:33
【问题描述】:

我现在正在创建一个简单的 React 组件。基本上,用户可以输入一个 ID,当他们提交时,它会显示容器中的一些信息。代码是这样的

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

    this.state = {
      Id: '',
      isSubmitted: false
    };
  }

  handleSubmit = (event) => {
    this.setState({
      isSubmitted: true
    });
  };

  handleChange = (event) => {
    this.setState({
      Id: event.target.value
    });
  };


  render() {
    return (
        <form onSubmit={this.handleSubmit}>
          <div
              style={{
                display: 'flex',
                justifyContent: 'center',
                alignItems: 'center'
              }}
          >
            <Input type={'text'} placeholder={"Enter Id"} value={this.state.Id} onChange={this.handleChange} />
            <Button type={'submit'} > Lookup </Button>
          </div>

          <div>
            {this.state.isSubmitted && <DetailsContainer Id={this.state.Id} />}
          </div>
        </form>
    );
  }
}

details 容器已经创建好了,只是返回了一些关于已经传入的 Id 的详细信息。我可以很好地显示我传入的第一个 Id 的详细信息。但是,当我输入另一个 ID 并提交表单时,DetailsContainer 不会重新呈现,并且仍在显示旧 ID 的详细信息。我尝试移动它并添加一些逻辑(我什至将 DetailsContainer 置于我的状态以查看是否可以那样操作它),但这似乎不起作用。我看到有一个shouldComponentUpdate() 方法,这似乎是我需要使用的,但我看到的指南都将它放在DetailsContainer 中。无论如何让我将它放在 IDContainer 中,还是有更简单的方法来重新渲染 DetailsContainer?

【问题讨论】:

  • 你的代码中有这个:&lt;DetailsContainer Id={this.state.promotionId} /&gt;} - this.state.promotionId 定义了吗?
  • IdpromotionId 之间似乎有些混淆——它们应该是同一个东西吗?您的输入更新了与传递给子 (DetailsContainer) 组件的不同的输入...
  • 是的,我的错,我做了上面的编辑。他们应该是同一件事。复制代码时出错。
  • 不是答案,但您可以使用以下语法替换整个 constructor 函数:state = { Id: '', isSubmitted: false }
  • 我认为这与您的 isSubmitted 状态在第一次变为真后没有改变有关。所以第一次提交时,它变为 true 并重新渲染,但第二次,它已经为 true。

标签: javascript reactjs react-component


【解决方案1】:

我认为这里的部分问题是,一旦设置了isSubmitted,您对输入所做的每一项更改都将应用于this.state.Id 并传递到DetailsContainer

我认为最好使用一个变量来跟踪输入状态,并使用一个变量来跟踪要传递给DetailsContainer 的 Id。

state = { Id: null, inputId: '' };

handleSubmit = (event) => {
  this.setState({
    Id: this.state.inputId
  });
};

handleChange = (event) => {
  this.setState({
    inputId: event.target.value
  });
};

render() {
  return (
    ...
    <Input ... value={this.state.inputId} />
    ...
    {this.state.Id !== null ? <DetailsContainer Id={this.state.Id} /> : null}
  );
}

【讨论】:

  • 我尝试了这个,发生的情况是,当页面最初使用空 ID 加载时,现在正在加载 DetailsContainer。而且,当我在表单中输入另一个 ID 时,它仍然显示 DetailContainer 为空 ID。我希望 DetailsContainer 在用户第一次点击进入后渲染,并在每次他们再次点击提交时重新渲染。
  • 抱歉,有一个错字 - 渲染&lt;DetailsContainer /&gt; 的检查应该是this.state.Id !== null(你只想渲染DetailsContainer 一旦Id 已经设置,以前它正在渲染只要设置了inputId
  • 啊,好的。所以现在页面在页面加载时没有显示 DetailsContainer,它在用户单击搜索后呈现(谢谢!)。但是,DetailsContainer 在我单击提交以获取不同的 Id 后不会重新呈现(仍显示第一个 Id 的详细信息)。
  • 这可能是您实现DetailsContainer 的问题。您是否尝试过登录DetailsContainerrender 函数,查看是否传入了值?您可能需要添加一个 componentDidUpdate 处理程序来处理 prop 更改时。
  • 啊,好的。所以我必须在 DetailsContainer 中更改 componentDidUpdate 以使其更新?没有办法在 IDContainer 里面做吗?问是因为我不是编写 DetailsContainer 的人,所以我不想更改它,除非它是必须的。另外,我应该使用componentDidUpdate 还是shouldComponentUpdate?直觉上我觉得可以对比一下,看看shouldComponentUpdate中的Id是不是变了,return True是这样的。
猜你喜欢
  • 2017-12-20
  • 2020-05-21
  • 2016-06-01
  • 2020-06-06
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
相关资源
最近更新 更多