可以更改外部组件中的 object(element) 吗?
Can change an object(element) in an external component?
我想在另一个组件上调用 changeArea
方法时更改区域(元素)。
我想这样做。
首先,App.js
export default function App(props) {
const [area, setArea] = React.useState(<><Button/><Button/></>)
const changeArea = (element) => {
setArea(element);
}
return (
<div>
{<area/>}
<ChildApp changeArea={changeArea}/>
</div>
);
}
而且,ChildApp.js
export default function ChildApp(props) {
// I want do call to change the area.
props.changeArea(<></Select></>);
…
}
无论如何,此代码无效。
Error
Error: Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.
PS. It’s a simplification of the way I want to do it.
const ChildApp = (props) => {
const buttonHandler = () => {
props.changeArea(<h1>World</h1>)
}
return <><button onClick={buttonHandler}>Hello</button> </>
}
export default function App() {
const [area, setArea] = React.useState(<><h1>Hello</h1></>)
const changeArea = (element) => {
setArea(element);
}
return (
<div>
{area}
<ChildApp changeArea={changeArea}/>
</div>
);
}
由于您在组件主体中调用 props.changeArea(<></Select></>);
,因此每次您的组件呈现(函数调用)时,您都会设置状态
父级(App
),组件中的每个更新状态都会导致重新渲染(调用)组件及其子级,结果你处理一个循环,你 props.changeArea(<></Select></>);
,它会导致重新渲染它是父级,并重新渲染父级导致调用 props.changeArea(<></Select></>);
您不能直接在函数体中调用,您可以在 useEffect
或某些 eventHandler
中调用。像这样:
export default function ChildApp(props) {
...
useEffect(()=> {
props.changeArea(<></Select></>);
}, []);
...
}
在上面的代码中,props.changeArea(<></Select></>);
第一次调用 ChildApp
渲染,而在 ChildApp
的其他渲染中它从不调用 props.changeArea
。
如果您想了解如何在 eventHandler
中做到这一点,您可以查看@Akhil 解决方案。
我想在另一个组件上调用 changeArea
方法时更改区域(元素)。
我想这样做。
首先,App.js
export default function App(props) {
const [area, setArea] = React.useState(<><Button/><Button/></>)
const changeArea = (element) => {
setArea(element);
}
return (
<div>
{<area/>}
<ChildApp changeArea={changeArea}/>
</div>
);
}
而且,ChildApp.js
export default function ChildApp(props) {
// I want do call to change the area.
props.changeArea(<></Select></>);
…
}
无论如何,此代码无效。
Error
Error: Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.
PS. It’s a simplification of the way I want to do it.
const ChildApp = (props) => {
const buttonHandler = () => {
props.changeArea(<h1>World</h1>)
}
return <><button onClick={buttonHandler}>Hello</button> </>
}
export default function App() {
const [area, setArea] = React.useState(<><h1>Hello</h1></>)
const changeArea = (element) => {
setArea(element);
}
return (
<div>
{area}
<ChildApp changeArea={changeArea}/>
</div>
);
}
由于您在组件主体中调用 props.changeArea(<></Select></>);
,因此每次您的组件呈现(函数调用)时,您都会设置状态
父级(App
),组件中的每个更新状态都会导致重新渲染(调用)组件及其子级,结果你处理一个循环,你 props.changeArea(<></Select></>);
,它会导致重新渲染它是父级,并重新渲染父级导致调用 props.changeArea(<></Select></>);
您不能直接在函数体中调用,您可以在 useEffect
或某些 eventHandler
中调用。像这样:
export default function ChildApp(props) {
...
useEffect(()=> {
props.changeArea(<></Select></>);
}, []);
...
}
在上面的代码中,props.changeArea(<></Select></>);
第一次调用 ChildApp
渲染,而在 ChildApp
的其他渲染中它从不调用 props.changeArea
。
如果您想了解如何在 eventHandler
中做到这一点,您可以查看@Akhil 解决方案。