- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用 ref
获取孙组件的状态,我使用 useImperativeHandle
对其进行了自定义,简化了整个代码
here .
function App() {
const ref = useRef(null);
return (
<div className="App">
<button
onClick={() => console.log(ref.current.name, ref.current.age)}
>click me</button>
<FilterFather ref={ref} />
</div>
);
}
const FilterFather = (_, ref) => {
const filter1Ref = useRef(null);
const filter2Ref = useRef(null);
useImperativeHandle(ref, () => ({
name: filter1Ref.current.name,
age: filter2Ref.current.age,
}))
return (
<>
<Filter1 ref={filter1Ref}/>
<Filter2 ref={filter2Ref} />
</>
)
}
export default forwardRef(FilterFather);
const Filter1 = (props, ref) => {
const [name, setName] = useState('lewis')
useImperativeHandle(ref, () => ({
name
}), [name])
return (
<>
<div>
name:
<input
value={name}
onChange={e => setName(e.target.value)}
/>
</div>
</>
)
}
const Filter2 = (props, ref) => {
const [age, setAge] = useState(18)
useImperativeHandle(ref, () => ({
age
}), [age])
return (
<>
<div>
age:
<input
value={age}
onChange={e => setAge(e.target.value)}
/>
</div>
</>
)
}
export default {
Filter1: forwardRef(Filter1),
Filter2: forwardRef(Filter2),
}
一层
forwardRef
和
useImperativeHandle
工作正常,两层出错
最佳答案
您在 FilterFather
中的命令式句柄不需要。它不会向 handle 添加/删除任何东西。您可以直接转发它:
const FilterFather = (_, ref) => {
return <Filter ref={ref} />;
};
useImperativeHandle(ref, () => ({
name: filterRef.current.name,
age: filterRef.current.age,
}), [filterRef]) // this will not update correctly
您通过了
filterRef
作为依赖项,但
filterRef
是静态的,即使在
filterRef.current.name
时也不会改变或
filterRef.current.age
变化。
useImperativeHandle
不应用于从子组件读取状态。实际上不鼓励在 react 中使用任何类型的命令式方法,除非没有其他方法。如果您使用本质上必不可少的 3rd 方库,则大多数情况下都是这种情况。
export default function App() {
const [values, setValues] = useState({
name: "lewis",
age: 18
});
const handleChange = useCallback(
(key, value) => setValues(current => ({ ...current, [key]: value })),
[]
);
return (
<div className="App">
<button onClick={() => console.log(values.name, values.age)}>
click me
</button>
<FilterFather values={values} onChange={handleChange} />
</div>
);
}
const FilterFather = props => {
return (
<>
<Filter label="Name" name="name" {...props} />
<Filter label="Age" name="age" {...props} />
</>
);
};
const Filter = ({ label, name, values, onChange }) => {
const handleChange = useCallback(e => onChange(name, e.target.value), [
name,
onChange
]);
return (
<>
<div>
<label>{label}:</label>
<input value={values[name]} onChange={handleChange} />
</div>
</>
);
};
关于reactjs - 多层 forwardRef 和 useImperativeHandle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62871875/
我有一个带有保存按钮的组件 requestSaveAsync()}>Save 我还需要能够从应用程序的顶层调用 requestSaveAsync,因此我在名为 useEditRow 的自定义钩子(H
我在子组件的 useImperativeHandle Hook 中创建了一个方法。然后,我可以完美地从父组件访问它。就像下面的例子。但是,我无法从子组件访问它。换句话说,focus from pare
我在子组件的 useImperativeHandle Hook 中创建了一个方法。然后,我可以完美地从父组件访问它。就像下面的例子。但是,我无法从子组件访问它。换句话说,focus from pare
function App(){ const cntEl:any = React.useRef(null); // I don't know what type should be here.
我需要使用 ref获取孙组件的状态,我使用 useImperativeHandle 对其进行了自定义,简化了整个代码 here . function App() { const ref = use
我不明白为什么需要以下 useImperativeHandle、useLayoutEffect 和 useDebugValue 钩子(Hook),您能否举例说明何时可以使用它们,但请不要使用文档中的示
我需要访问子组件的位置。据我了解,要访问子属性,我需要使用 useImperativeHandle 将子 API 添加到其 ref。此外,我需要使用 forwardRef 将引用从父级传递给子级。所以
文档中提供的示例如下: function FancyInput(props, ref) { const inputRef = useRef(); useImperativeHandle(ref
我是一名优秀的程序员,十分优秀!