我有一个这样的应用程序:
<App>
<Child_A>
<Child_A_A />
</Child_A>
</App>
在Child_A_A的级别上,我想通过能够像这样包装应用程序来影响整个Dom:
<ViewPortSettings>
<App>
<Child_A>
<Child_A_A />
</Child_A>
</App>
</ViewPortSettings>
因此,基本上我想要某种变量或钩子来影响整个应用程序是否被包装:
// Child_A_A.js
global.useViewport(true)
我有什么选择?
一个简单的解决方案是创建两个版本,您可以将它们制作成单独的组件,然后有条件地制作:
{condition && <ViewPortSettings>
<App>
<Child_A>
<Child_A_A />
</Child_A>
</App>
</ViewPortSettings>}
{!condition && <App>
<Child_A>
<Child_A_A />
</Child_A>
</App>}
据我所知,您必须使用useReducer
,以防您希望使用react的核心来解决它。我认为context
或任何其他方式都不适合这样做。
在Child_A_A
组件中,调度操作:
const [state, dispatch] = useReducer(reducer, initialState);
// dispatch somewhere in your component
dispatch({type: 'wrap'})
在您的主要组件中,检查调度的操作:
const initialState = {show: false};
// Reducer
function reducer(state, action) {
switch (action.type) {
case 'wrap':
return {show: true};
default:
throw new Error();
}
}
// your main component:
function Main() {
const [state] = useReducer(reducer, initialState);
return (
{state.show && <ViewPortSettings>}
<App>
<Child_A>
<Child_A_A />
</Child_A>
</App>
{state.show && </ViewPortSettings>}
)
}