我创建了一个弹出窗口,用户可以使用该弹出窗口向应用程序中添加内容,每个字段都是一个单独的组件,因为我需要在不同配置的多个位置重复使用它们。
我尝试创建一个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内,这就是为什么甚至输入组件也都带有value
andonChange
事件的原因。React无法跟踪其外部发生的数据更改。据我从您的问题中了解到,更改是在React App中发生的,因此,与其通过innerRef跟踪数据,不如使用React自己的方法在React中跟踪数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句