如何在使用 useRef 钩子接收到 child 的引用后重新渲染 parent 组件?
How to rerender parent component after receiving child's ref with useRef hook?
我正在努力解决一个烦人的问题:
我有一个 parent 组件和一个 child 组件。 child 具有绝对定位和动态高度。我需要根据 child 的高度计算 parent 的边距。我尝试做类似
的事情
const Parent = () => {
const childRef = useRef(null);
return (
<Child saveRef={ref} />
);
const Child = ({saveRef}) => (<div ref={saveRef}> </div>);
但问题是 Parent 组件在 Ref 完成时不会重新呈现。
如何在收到 Ref 后重新渲染 Parent 组件?
在此先感谢您的帮助和建议。
在初始装载时 运行 在父级中写入一个效果。此效果将 运行 在 ref 初始化并渲染 child 后。在此之后在父级中维护一个状态,这是您需要计算的边距,一旦计算出边距更新状态
const Parent = () => {
const childRef = useRef(null);
const [margin, updateMargin] = useState(0);
useEffect(() => {
// calculate margin. Let call it margin
updateMargin(margin);
}, []);
return (
<Child saveRef={ref} />
);
const Child = ({saveRef}) => (<div ref={saveRef}> </div>);
编辑: 为了在 window 调整大小时更新,您需要在 window 调整大小时添加一个事件监听器并重新计算高度
const Parent = () => {
const childRef = useRef(null);
const [margin, updateMargin] = useState(0);
useEffect(() => {
window.addEventListener('resize', handleResize);
() => {
window.removeEventListener('resize', handleResize);
}
}, []);
const handleResize = () => {
// use ref, calcualte margin and update
}
return (
<Child saveRef={ref} />
);
您可以将函数作为 prop 从父级传递给子级,并在需要重新渲染父级时调用该函数。更改状态会触发渲染。所以在函数中你可以改变一个状态。
class Parent extends React.Component{
state = {ref : null}
handleRef = ref => {
this.setState({ ref });
// your add you method for changing margin
}
render(){
return <Child ref={this.state.ref} handleRefChange={this.handleRef} />
}
}
将ref保存在父组件中,调用子组件的handleRefChange进行更新
我正在努力解决一个烦人的问题:
我有一个 parent 组件和一个 child 组件。 child 具有绝对定位和动态高度。我需要根据 child 的高度计算 parent 的边距。我尝试做类似
的事情const Parent = () => {
const childRef = useRef(null);
return (
<Child saveRef={ref} />
);
const Child = ({saveRef}) => (<div ref={saveRef}> </div>);
但问题是 Parent 组件在 Ref 完成时不会重新呈现。 如何在收到 Ref 后重新渲染 Parent 组件?
在此先感谢您的帮助和建议。
在初始装载时 运行 在父级中写入一个效果。此效果将 运行 在 ref 初始化并渲染 child 后。在此之后在父级中维护一个状态,这是您需要计算的边距,一旦计算出边距更新状态
const Parent = () => {
const childRef = useRef(null);
const [margin, updateMargin] = useState(0);
useEffect(() => {
// calculate margin. Let call it margin
updateMargin(margin);
}, []);
return (
<Child saveRef={ref} />
);
const Child = ({saveRef}) => (<div ref={saveRef}> </div>);
编辑: 为了在 window 调整大小时更新,您需要在 window 调整大小时添加一个事件监听器并重新计算高度
const Parent = () => {
const childRef = useRef(null);
const [margin, updateMargin] = useState(0);
useEffect(() => {
window.addEventListener('resize', handleResize);
() => {
window.removeEventListener('resize', handleResize);
}
}, []);
const handleResize = () => {
// use ref, calcualte margin and update
}
return (
<Child saveRef={ref} />
);
您可以将函数作为 prop 从父级传递给子级,并在需要重新渲染父级时调用该函数。更改状态会触发渲染。所以在函数中你可以改变一个状态。
class Parent extends React.Component{
state = {ref : null}
handleRef = ref => {
this.setState({ ref });
// your add you method for changing margin
}
render(){
return <Child ref={this.state.ref} handleRefChange={this.handleRef} />
}
}
将ref保存在父组件中,调用子组件的handleRefChange进行更新