Javascript 为什么setState不设置将数组追加到状态?

Javascript 为什么setState不设置将数组追加到状态?,javascript,reactjs,Javascript,Reactjs,我必须创建一个包含多个链接的文本区域,然后将其拆分为数组。是的,它工作正常,但我想将该数组设置为链接列表中的状态:[],但当我单击“提交”按钮时,它在初始化时会给我空数组。但当我再次按下提交按钮时,它会给出我想要的列表,为什么?下面是代码和输出 onSubmit = event => { this.setState({ loading: true, host: undefined }); const { text, linkList } = this.state;

我必须创建一个包含多个链接的文本区域,然后将其拆分为数组。是的,它工作正常,但我想将该数组设置为链接列表中的状态:[],但当我单击“提交”按钮时,它在初始化时会给我空数组。但当我再次按下提交按钮时,它会给出我想要的列表,为什么?下面是代码和输出

onSubmit = event => {
    this.setState({ loading: true, host: undefined });
    const { text, linkList } = this.state;

    console.log(text);
    const mList = text.split("\n").filter(String);
    console.log(mList);
    this.setState({
      linkList: [...mList]
    });
    console.log(linkList);

    event.preventDefault();
  };
首先单击输出控制台

youtube.com
google.com
facebook.com
------------------------------------------------------------
["youtube.com", "google.com", "facebook.com"]
------------------------------------------------------------
[]
输出控制台第二次单击

youtube.com
google.com
facebook.com
--------------------------------------------- 
["youtube.com", "google.com", "facebook.com"]
---------------------------------------------
["youtube.com", "google.com", "facebook.com"]

下面的代码可能会有所帮助

onSubmit = event => {
    this.setState({ loading: true, host: undefined }, () => {
      const { text, linkList } = this.state;

      console.log(link);
      const mList = text.split("\n").filter(String);
      console.log(mList);
      this.setState({
        linkList: [...mList]
      }, () => {
        console.log(linkList);
        event.preventDefault();
      });
    });
  };

下面的代码可能会有所帮助

onSubmit = event => {
    this.setState({ loading: true, host: undefined }, () => {
      const { text, linkList } = this.state;

      console.log(link);
      const mList = text.split("\n").filter(String);
      console.log(mList);
      this.setState({
        linkList: [...mList]
      }, () => {
        console.log(linkList);
        event.preventDefault();
      });
    });
  };
setState是异步的。这意味着它不会马上发生,而是在很短的时间内发生。如果您添加了一个:

console.log(linkList)
在渲染方法的顶部,您将看到与预期一样附加的项目。

setState是异步的。这意味着它不会马上发生,而是在很短的时间内发生。如果您添加了一个:

console.log(linkList)

在“渲染方法”的顶部,您将看到与预期一样附加的项目。

它可能正在附加,只是在下一次渲染之前不可用

从:

setState并不总是立即更新组件。它可以批处理更新或将更新推迟到以后。这使得在调用setState之后立即读取This.state成为一个潜在的陷阱。相反,请使用componentDidUpdate或setState回调setStateupdater callback,这两者都保证在应用更新后触发


它可能正在追加,只是在下一次渲染之前不可用

从:

setState并不总是立即更新组件。它可以批处理更新或将更新推迟到以后。这使得在调用setState之后立即读取This.state成为一个潜在的陷阱。相反,请使用componentDidUpdate或setState回调setStateupdater callback,这两者都保证在应用更新后触发