我可以使用 React 中的函数提供上下文值吗?
Can I provide context values using a function in React?
我目前正在问自己以下问题:
是否建议我直接在 ContextProvider 中定义我的状态和逻辑,或者我是否可以在单独的函数中定义状态和逻辑以稍微分离代码?
示例:
const MyContext = React.createContext({});
const createStore = () => {
const [myState, setMyState] = useState();
return {
myState,
setMyState
}
}
const MyContextProvider = ({ children }) => {
const store = createStore();
return (
<MyContext.Provider value={store}>{children}</MyContext.Provider>
)
}
我有点害怕那个createStore
功能。如果 Provider 重新呈现,createStore 是否总是被重新创建?
编辑:
谢谢解答!
如果我想在 useCreateStore
挂钩中使用参数怎么办?
参数会更新吗?
示例:
const MyContext = React.createContext({});
const useCustomStore= (myAwesomeValue) => {
const [myState, setMyState] = useState();
const doSomething = useCallback(() => {
//
}, [myAwesomeValue])
return {
myState,
setMyState
}
}
const MyContextProvider = ({ children, title }) => {
const { myState } = useCustomStore(title); //You need to desctructure the returned object here, note myState
return (
<MyContext.Provider value={myState}>{children}</MyContext.Provider>
)
}
您尝试为“商店”创建的内容称为 custom hook
不过您需要进行一些更改。通常使用 'use' 作为自定义挂钩的开始。所以,我在这里将 createStore
重命名为 useCustomStore
。因为它是一个带有 useState 的自定义钩子,所以它遵循与您在上下文提供程序中实际拥有它一样的规则
此外,您的自定义挂钩 returns 一个包含状态和变异方法的对象。您将需要直接访问状态 store.myState
或者您可以像我在示例中那样对其进行解构 { myState}
。
const MyContext = React.createContext({});
const useCustomStore= () => {
const [myState, setMyState] = useState();
return {
myState,
setMyState
}
}
const MyContextProvider = ({ children }) => {
const { myState } = useCustomStore(); //You need to desctructure the returned object here, note myState
return (
<MyContext.Provider value={myState}>{children}</MyContext.Provider>
)
}
与
相同
const MyContext = React.createContext({});
const MyContextProvider = ({ children }) => {
const [myState, setMyState] = useState();
return (
<MyContext.Provider value={myState}>{children}</MyContext.Provider>
)
}
因此重新渲染将保留状态,因为它使用了 useState 挂钩。
我目前正在问自己以下问题: 是否建议我直接在 ContextProvider 中定义我的状态和逻辑,或者我是否可以在单独的函数中定义状态和逻辑以稍微分离代码?
示例:
const MyContext = React.createContext({});
const createStore = () => {
const [myState, setMyState] = useState();
return {
myState,
setMyState
}
}
const MyContextProvider = ({ children }) => {
const store = createStore();
return (
<MyContext.Provider value={store}>{children}</MyContext.Provider>
)
}
我有点害怕那个createStore
功能。如果 Provider 重新呈现,createStore 是否总是被重新创建?
编辑: 谢谢解答!
如果我想在 useCreateStore
挂钩中使用参数怎么办?
参数会更新吗?
示例:
const MyContext = React.createContext({});
const useCustomStore= (myAwesomeValue) => {
const [myState, setMyState] = useState();
const doSomething = useCallback(() => {
//
}, [myAwesomeValue])
return {
myState,
setMyState
}
}
const MyContextProvider = ({ children, title }) => {
const { myState } = useCustomStore(title); //You need to desctructure the returned object here, note myState
return (
<MyContext.Provider value={myState}>{children}</MyContext.Provider>
)
}
您尝试为“商店”创建的内容称为 custom hook
不过您需要进行一些更改。通常使用 'use' 作为自定义挂钩的开始。所以,我在这里将 createStore
重命名为 useCustomStore
。因为它是一个带有 useState 的自定义钩子,所以它遵循与您在上下文提供程序中实际拥有它一样的规则
此外,您的自定义挂钩 returns 一个包含状态和变异方法的对象。您将需要直接访问状态 store.myState
或者您可以像我在示例中那样对其进行解构 { myState}
。
const MyContext = React.createContext({});
const useCustomStore= () => {
const [myState, setMyState] = useState();
return {
myState,
setMyState
}
}
const MyContextProvider = ({ children }) => {
const { myState } = useCustomStore(); //You need to desctructure the returned object here, note myState
return (
<MyContext.Provider value={myState}>{children}</MyContext.Provider>
)
}
与
相同const MyContext = React.createContext({});
const MyContextProvider = ({ children }) => {
const [myState, setMyState] = useState();
return (
<MyContext.Provider value={myState}>{children}</MyContext.Provider>
)
}
因此重新渲染将保留状态,因为它使用了 useState 挂钩。