【问题标题】:React UseSelector with render upon variable change在变量更改时将 UseSelector 与渲染反应
【发布时间】:2020-08-30 09:46:30
【问题描述】:

我正在尝试根据组件中的选定值 (selectedNum) 从使用 Redux 的状态中检索过滤后的数组。但是,在 selectNumberHandler 触发后,重新渲染似乎不会触发调用 useSelector 。

我试图在处理程序本身中过滤数字数组,但这似乎也没有过滤全局范围内的渲染数字。

我也尝试添加以下内容,但无济于事(在 onChange 中设置 var 后未命中调试器点):

  useEffect(() => {
    debugger;
  }, [selectedNum]);

您能帮我找到解决这类问题的最佳做法吗?

const MyFunction = () => {
  let selectedNum: number;
  let numbers = useSelector(filterNumbers(selectedNum));

  const selectNumberHandler (selectedValue) => {
      selectedNum = selectedValue;
  }

  return (
    <div>
      <select onChange={e => selectNumberHandler(e)}>
        <option value='1' >1</option>
        <option value='2' >2</option>
      </select>
      <div className={'numbers-list'}>
        {numbers.map(num => {
          <p>{num}</p>;
        })}
      </div>
    </div>
  );
};

【问题讨论】:

  • filterNumbers 方法在哪里,它有什么作用?

标签: reactjs redux react-redux react-hooks


【解决方案1】:

useSelector 将状态函数作为参数。 State 是 redux 存储的状态。像这样:

const numbers = useSelector(state => somewhereinstate.number);

这样,我们就可以从redux store中选择变量了。您似乎想要做的是更新 selectedNum 变量。但我看不到您将该更新发送到商店的位置。您的useEffect 不会触发,因为它依赖于selectedNum。您的 selectNumberHandler 可能会更改 selectedNum,但您的组件不知道这一点,因为 selectedNum 不是组件中的状态变量。

所以你需要决定:你是保持组件本地的状态,还是通过商店进行通信?

组件本地 - 没有 useSelector

const MyFunction = () => {

  const [selectedNumber, setSelectedNumber] = useState(1)
  const [filteredNumbers, setFilteredNumbers] = useState([])

  useEfect( () => {
    setFilteredNumbers(selectedNumber)
  }, [selectedNumber])

  return (
    <div>
      <select onChange={e => setSelectedNumber(e.value)}>
        <option value='1' >1</option>
        <option value='2' >2</option>
      </select>
      <div className={'numbers-list'}>
        {filteredNumbers.map(num => {
          <p>{num}</p>;
        })}
      </div>
    </div>
  );
};

通过 redux 存储,使用 useDispatchuseSelector


const MyFunction = () => {

  const numbers = useSelector(state => state.yourValues);
  const dispatch = useDispatch()


  return (
    <div>
      <select onChange={e => dispatch( setYourValues(e.value) )}>
        <option value='1' >1</option>
        <option value='2' >2</option>
      </select>
      <div className={'numbers-list'}>
        {numbers.map(num => {
          <p>{num}</p>;
        })}
      </div>
    </div>
  );
};

其中setYourValue 是一个函数,它创建一个操作来更新redux 存储中的yourValue

希望这能给你一些方向。

【讨论】:

  • 还有一个问题。最初使用 Redux 中的 UseSelector 填充状态过滤数字变量,即最初从 Redux 将 dat 拉入本地状态。何时/如何在本地方法中完成?
  • 作为useState()的参数。你会看到我写了const [filteredNumbers, setFilteredNumbers] = useState([]),它将filteredNumbers初始化为一个空数组。您在useState 中放入的任何内容都是组件加载时该变量的值。如果将其留空,则该变量将被视为未定义。
  • 我尝试将以下内容作为 useState(useSelector(filterNumbers(selectedNum))) 放在 useState 中,但这似乎并未使用来自选择器的值初始化数组。此处是否存在会阻止 useSelector 初始化的操作顺序?
  • useSelector(filterNumbers(selectedNum)) 非常混乱。同样,useSelector 旨在从 redux 存储中选择部分状态。 filterNumbers() 是什么?它应该是state =&gt; state.some.piece.of.state 形式的函数。所以假设你这样做了,写const initialState = useSelector(state =&gt; state.thing)。然后你会写useState(initialState)。也许那会奏效。但为什么?你希望你的州住在哪里?我会选择一个。要么从存储中选择一个初始值,要么用useState(someInitialValue)初始化一个局部状态变量
猜你喜欢
  • 2022-01-22
  • 2020-04-02
  • 2020-04-22
  • 2019-07-26
  • 2023-01-04
  • 1970-01-01
  • 2022-12-23
  • 2021-07-27
  • 2021-05-26
相关资源
最近更新 更多