React Select 总是重新渲染,即使改变另一个状态

React Select Always re-render, even when change another state

React Select 始终重新渲染,即使更改另一个状态也是如此。

...
  const [expense_currency, setExpenseCurrency] = React.useState(expense_claim.expense_currency);
  const [remarks, setRemarks] = React.useState(expense_claim.remarks);
  ...
  ...
  return (
     ...
        <div className="form-group row p-0 col-sm-12 col-md-6">
           <label className="text-nowrap col-form-label col-sm-4">Currency</label>
           <div className="col-sm-8 p-0" title={expense_currency}>
              <Select
                  className="select2"
                  placeholder="Select Currency"
                  isDisabled={false}
                  isClearable={true}
                  value={expense_currency}
                  options={select_currency}
                  onChange={selected => { setExpenseCurrency(selected.value) }}
              />
           </div>
        </div>
        <div className="form-group row p-0 col-sm-12 col-md-6">
           <label className="text-nowrap col-form-label col-sm-4">
              Remarks
           </label>
           <div className="col-sm-8 p-0">
              <textarea
                 className="form-control"
                 required={true}
                 disabled={false}
                 name="remarks"
                 placeholder=""
                 defaultValue={remarks}
                 onChange={e => setRemarks(e.target.value)}
              ></textarea>
          </div>
      </div>
  )

来自我的 chrome React 分析器的 SS

我试过 react-select v2.0.0 到 v.2.4.4 都有相同的结果。 我可以知道如何让它在我更新备注字段时不重新呈现吗?

这取决于 Select 是否使用 PureComponent 或 memo() 或类似的东西。但是,如果它是你传入的道具,那么每次都会破坏检查,因为你在每次渲染时都为 onChange 创建回调。

要获得一致的回调参考,请使用 useCallback:

const onSelectChange = useCallback(selected => setExpenseCurrency(selected.value), [setExpenseCurrency]);

并传入:

onChange={onSelectChange}

如果 select_currency 是非原始类型,例如数组或对象,您将需要确保它们也是一致的引用。你没有 post 所以不能提供建议。