useEffect不是由子组件的ref.current更改触发的

暗恋

我创建了一个弹出窗口,用户可以使用该弹出窗口向应用程序中添加内容,每个字段都是一个单独的组件,因为我需要在不同配置的多个位置重复使用它们。

我尝试创建一个innerRef当更改(即键入新值)时,如果所有值均有效,useEffect则应触发该组件的Done按钮以显示或隐藏按钮。

我知道valid我分配给prop的所有值是否有效.current

export default function AddStock() {
  const selectTypeOfQuantityRef = useRef({});
  const [allValid, setAllValid] = useState(false);

  useEffect(() => {
    const allValues = [selectTypeOfQuantityRef.current.valid];

    allValues.every((value) => value) ? setAllValid(true) : setAllValid(false);
    console.log(allValues.every((value) => value)); // does not get triggered
  }, [selectTypeOfQuantityRef.current]);

return (
    <>
      <AddPopup>
        <SelectTypeOfQuantity innerRef={selectTypeOfQuantityRef} />
        {allValid && <DoneButton/>}
        <CancelButton/>
      </AddPopup>
    </>
  );
}

这就是选择本身(当然是习惯),它会在状态改变时设置innerRef。这里的一切正常,这个小组件本身的状态可以正确管理,但不会触发父组件的状态更新

export default function SelectTypeOfQuantity({ defaultValue = null, innerRef }) {
  const [selectTypeOfQuantity, setSelectTypeOfQuantity] = useState(defaultValue);
  const [valid, setValid] = useState(false);
  const [errMessage, setErrMessage] = useState("Избери стойност!");

  useEffect(() => {
    innerRef.current.value = selectTypeOfQuantity;
    handleValidation(selectTypeOfQuantity);
  }, [selectTypeOfQuantity]);

  const handleValidation = (value) => {
    const result = validateAutocomplete(value);
    if (result.valid) {
      setValid(true);
      setErrMessage(null);
      innerRef.current.valid = result.valid;
    } else {
      setValid(false);
      setErrMessage(result.errMessage);
    }
  };

  const selectTypeOfQuantityOnChange = (e, val) => {
    setSelectTypeOfQuantity(val ? val.value : null);
  };

  return (
    <Select onChange={selectTypeOfQuantityOnChange}/>
  );
}
普希金

useRef不会触发转售,因此useEffect不会被称为

使用useRef时,你需要可用无论组件生命周期的信息且其变动应该不会触发重新呈现。使用useState信息,其变化应触发重新呈现。

正如React的哲学所言,所有数据都必须驻留在React内,这就是为什么甚至输入组件也都带有valueandonChange事件的原因。React无法跟踪其外部发生的数据更改。据我从您的问题中了解到,更改是在React App中发生的,因此,与其通过innerRef跟踪数据,不如使用React自己的方法在React中跟踪数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

useEffect在组件加载时触发,而不是在状态更改时触发,正如我已经设置的那样

来自分类Dev

在子组件的useEffect之前触发父组件的useEffect

来自分类Dev

子组件无法触发状态更改

来自分类Dev

子组件之间的通信 - 触发和更改

来自分类Dev

道具更改不会触发useEffect

来自分类Dev

角度:@Input更改未在子组件中触发

来自分类Dev

useEffect在状态更改后未触发

来自分类Dev

屏幕尺寸更改时触发useEffect

来自分类Dev

Firefox在选择而不是更改时触发

来自分类Dev

获取observableArray项的子属性以触发更改

来自分类Dev

react:如何从其父级更改子组件(功能组件,而不是类组件)的状态?

来自分类Dev

反应:为什么从useRef更改ref的当前值不会在这里触发useEffect

来自分类Dev

通过其同级触发状态更改时,子组件不会重新呈现

来自分类Dev

React-redux:无法在父状态更改时触发子组件操作

来自分类Dev

prop依赖项更改时,react useEffect挂钩不会触发

来自分类Dev

更改对象属性时触发组件重新渲染

来自分类Dev

骨干视图在听模型,不是在更改或重置时触发?

来自分类Dev

更改子属性时触发RaisePropertyChanged-MvvmCross

来自分类Dev

Knockout.js子对象触发父计算中的更改

来自分类Dev

更改子属性时触发RaisePropertyChanged-MvvmCross

来自分类Dev

WPF DataGridRow在触发时更改子控件的属性

来自分类Dev

转换器只会触发一次,而不是每次标签内容更改时都会触发

来自分类Dev

触发子组件中的功能

来自分类Dev

如何触发子组件功能

来自分类Dev

EmberJS触发子组件对父组件的操作

来自分类Dev

悬停状态不是由 PointerEnter 事件触发的

来自分类Dev

如何在引用可能更改值的子视图中触发值更改事件?

来自分类Dev

在子组件具有项目列表的情况下,触发/更新在Quasar / Vue中从子组件更改为父组件的数据

来自分类Dev

ReactJS:更改子组件的状态

Related 相关文章

  1. 1

    useEffect在组件加载时触发,而不是在状态更改时触发,正如我已经设置的那样

  2. 2

    在子组件的useEffect之前触发父组件的useEffect

  3. 3

    子组件无法触发状态更改

  4. 4

    子组件之间的通信 - 触发和更改

  5. 5

    道具更改不会触发useEffect

  6. 6

    角度:@Input更改未在子组件中触发

  7. 7

    useEffect在状态更改后未触发

  8. 8

    屏幕尺寸更改时触发useEffect

  9. 9

    Firefox在选择而不是更改时触发

  10. 10

    获取observableArray项的子属性以触发更改

  11. 11

    react:如何从其父级更改子组件(功能组件,而不是类组件)的状态?

  12. 12

    反应:为什么从useRef更改ref的当前值不会在这里触发useEffect

  13. 13

    通过其同级触发状态更改时,子组件不会重新呈现

  14. 14

    React-redux:无法在父状态更改时触发子组件操作

  15. 15

    prop依赖项更改时,react useEffect挂钩不会触发

  16. 16

    更改对象属性时触发组件重新渲染

  17. 17

    骨干视图在听模型,不是在更改或重置时触发?

  18. 18

    更改子属性时触发RaisePropertyChanged-MvvmCross

  19. 19

    Knockout.js子对象触发父计算中的更改

  20. 20

    更改子属性时触发RaisePropertyChanged-MvvmCross

  21. 21

    WPF DataGridRow在触发时更改子控件的属性

  22. 22

    转换器只会触发一次,而不是每次标签内容更改时都会触发

  23. 23

    触发子组件中的功能

  24. 24

    如何触发子组件功能

  25. 25

    EmberJS触发子组件对父组件的操作

  26. 26

    悬停状态不是由 PointerEnter 事件触发的

  27. 27

    如何在引用可能更改值的子视图中触发值更改事件?

  28. 28

    在子组件具有项目列表的情况下,触发/更新在Quasar / Vue中从子组件更改为父组件的数据

  29. 29

    ReactJS:更改子组件的状态

热门标签

归档