【问题标题】:React 16.13: useState wait for state to update before renderReact 16.13:useState 在渲染前等待状态更新
【发布时间】:2021-01-17 01:19:46
【问题描述】:

我有一个字符串数组,它在状态中计数:

const [count, setCount] = useState(0);
const [strings, setStrings] = useState([""]);

所以一开始我总是有一个元素处于状态。 单击按钮时,我将添加到计数和列表中:

function onClickAdd() {
    setStrings(prev => [...prev, ""]);
    setCount(count + 1);
}

我正在根据这个计数呈现多个文本字段,这些文本字段的值是从数组索引设置的(范围是自定义函数,从开始 -> 结束返回值数组):

function makeInputs(count, onRemove) {
    return range(1, count).map(id => {
        return (
            <TextInput type="url" validate onChange={e => onChange(e, id)} value={strings[id]}
               icon={<Button style={{backgroundColor: "red"}} onClick={() => onRemove(id)}><Icon>remove</Icon></Button>} />
        );
    });
}

但是每当我单击添加按钮时,都会呈现新字段并且新字段的值设置为未定义(字符串数组尚未更新),并且我收到警告:

index.js:1 警告:组件正在更改要控制的 url 类型的不受控制的输入。输入元素不应从不受控切换到受控(反之亦然)。在组件的生命周期内决定使用受控或不受控的输入元素

如何在调整列表大小之前延迟渲染? 我尝试将setCount() 移动到useEffect(),但这样做根本不会显示新字段。

https://codesandbox.io/s/aged-dew-eud84?fontsize=14&hidenavigation=1&theme=dark

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

试试这个

  function Form() {
  const [values, setValues] = useState([]);

  return (
    <div>
      <button onClick={() => setValues([...values, ""])}>Add</button>

      {values.map((value, idx) =>
        <div key={String(idx)}>
          <input
            type="text"
            value={value}
            onChange={(e) => {
              values[idx] = e.target.value;

              setValues([...values]);
            }}
          />
        </div>
      )}
    </div>
  );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2021-09-09
    • 2019-06-26
    • 2020-12-28
    • 1970-01-01
    相关资源
    最近更新 更多