javascript - 在 JSX 中显示状态列表

标签 javascript reactjs

我有一些简单的代码:

class App extends React.Component {
  state = {
    letters: ["a", "b", "c"]
  };

  addLetter = () => {
    const { letters } = this.state;
    letters.push("d");
    this.setState({ letters });
  };

  render() {
    return (
      <div>
        <button onClick={this.addLetter}>Click to add a letter</button>
        <h1>letters: {this.state.letters}</h1>
      </div>
    );
  }
}

render(<App />, document.getElementById("root"));

工作示例 here .

当我点击按钮时,字母 'd' 应该被添加到状态中的 letters 中。这按预期工作。但是,当状态更改时,这些字母不会像人们预期的那样在页面上更新。

值得注意的是:

<h1>letters: {this.state.letters.reduce((a, l) => a + l, "")}</h1>

或:

<h1>letters: {this.state.letters.toString()}</h1>

按预期更新页面。

这是为什么?

最佳答案

你需要替换字母的状态(数组),而不是改变它(working example)。根据 react docs : 不要直接修改状态。

当您将数组转换为字符串时,当前字符串与前一个字符串不同,因为字符串是不可变的。然而,即使您向它添加另一个项目,该数组仍保持相同的数组。

示例:

const a = [1, 2, 3];
const strA = a.toString();
a.push(4);
const strB = a.toString();

console.log(a === a); // true
console.log(strA === strB); // false

解决方案:从旧数组创建一个新数组。

addLetter = () => {
  const { letters } = this.state;
  this.setState({ letters: [...letters, 'd'] });
}; 

关于javascript - 在 JSX 中显示状态列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50106508/

相关文章:

javascript - Express.js 静态 html 与 get

javascript - 使用 jquery 验证多次上传的文件大小

javascript - 无法使用 linkedState 读取 ReactJs 中的 null 值

javascript - Mobx - runInAction() 用法。为什么我们需要它?

javascript - 使用状态在 React 中显示/隐藏组件

javascript - 如何将客户端渲染的 HTML 插入 DOM

javascript - 使用 Babel,为什么函数的长度属性会根据异步与否而改变?

javascript - highcharts 的水平滚动条,不是 Highstock

javascript - React Js 单击时反向反转数组

reactjs - 使用图像作为 react 选择的图标