React:在使用上下文时在与上下文声明相同的文件中设置值时遇到问题
React: Having issues with using contexts with setting the value in the same file as the context declaration
我正在修复项目中正在进行的一些道具钻探。我的 app.js 目前每 5 秒查询一次数据库健康状况,并为一些变量定义上下文。
我在从上下文中获取 setter 时遇到问题。
App.js(提供商方):
ConnectionContext=React.createContext({})
const App = () => {
const [isConnectedtoDB,setConnectedtoDB]=useState({isConnected:{}});
const setConnected=useContext(ConnectionContext)
useInterval(() => {
const health = (await health.get()).data
if(Date.now() - health.connection.time_last_message > 10000){
setConnected({isConnected:false})
} else{
setConnected({isConnected:health.connection.alive})
},5000)
navbar.js(消费者端):
const NavBar = () =>{
const {isConnected}=useContext(ConnectionContext)
return (
{isConnected ? &&
<p>I'm alive!</p>
})
我在网上看到一种解决方案是将设置包装在 UseEffect 块中,但我相当确定您不能将 UseEffect 嵌套在 UseInterval 中,因为 UseInterval 本身是由 UseEffect 块定义的。
useInterval 从另一个文件导出如下:
export const useInterval = (callback,delay) => {
const savedCallback = useRef()
useEffect(() => {
function tick() {
savedCallback.current()
}
if (delay !== null) {
let id = setInterval(tick,delay)
return () => clearInterval(id)
}
},[delay]}
}
我得到的错误是 setConnected 不是函数
您正在使用父组件中的上下文,它只是为消费者提供价值
setConnected 应该是您的本地状态
const [connected, setConnected] = useState({});
您需要将父级(提供者)的状态值提供给子级(消费者)。
示例:
Parent.js
import React, {createContext, useState} from 'react';
export const ExampleContext = createContext();
function Parent(props){
const [isConnected, setConnected] = useState({})
useInterval(() => {
const health = (await health.get()).data;
if(Date.now() - health.connection.time_last_message > 10000){
setConnected({isConnected:false})
} else{
setConnected({isConnected:health.connection.alive})
},5000)
return (
<ExampleContext.Provider value={{ isConnected }}>
{props.children}
</ExampleContext.Provider>
)
}
export default Parent;
Child.js
import React, {useContext} from 'react';
import {ExampleContext} from './Parent';
function Child(){
const { isConnected } = useContext(ExampleContext);
return(
<div>
{<button> Context in Action: { isConnected } </button>}
</div>
)
}
export default Child;
在您的主 App.js 文件中,您将 child.js 渲染为 parent.js
的子级
<Parent>
<Child />
</Parent>
我正在修复项目中正在进行的一些道具钻探。我的 app.js 目前每 5 秒查询一次数据库健康状况,并为一些变量定义上下文。 我在从上下文中获取 setter 时遇到问题。
App.js(提供商方):
ConnectionContext=React.createContext({})
const App = () => {
const [isConnectedtoDB,setConnectedtoDB]=useState({isConnected:{}});
const setConnected=useContext(ConnectionContext)
useInterval(() => {
const health = (await health.get()).data
if(Date.now() - health.connection.time_last_message > 10000){
setConnected({isConnected:false})
} else{
setConnected({isConnected:health.connection.alive})
},5000)
navbar.js(消费者端):
const NavBar = () =>{
const {isConnected}=useContext(ConnectionContext)
return (
{isConnected ? &&
<p>I'm alive!</p>
})
我在网上看到一种解决方案是将设置包装在 UseEffect 块中,但我相当确定您不能将 UseEffect 嵌套在 UseInterval 中,因为 UseInterval 本身是由 UseEffect 块定义的。 useInterval 从另一个文件导出如下:
export const useInterval = (callback,delay) => {
const savedCallback = useRef()
useEffect(() => {
function tick() {
savedCallback.current()
}
if (delay !== null) {
let id = setInterval(tick,delay)
return () => clearInterval(id)
}
},[delay]}
}
我得到的错误是 setConnected 不是函数
您正在使用父组件中的上下文,它只是为消费者提供价值
setConnected 应该是您的本地状态
const [connected, setConnected] = useState({});
您需要将父级(提供者)的状态值提供给子级(消费者)。
示例:
Parent.js
import React, {createContext, useState} from 'react';
export const ExampleContext = createContext();
function Parent(props){
const [isConnected, setConnected] = useState({})
useInterval(() => {
const health = (await health.get()).data;
if(Date.now() - health.connection.time_last_message > 10000){
setConnected({isConnected:false})
} else{
setConnected({isConnected:health.connection.alive})
},5000)
return (
<ExampleContext.Provider value={{ isConnected }}>
{props.children}
</ExampleContext.Provider>
)
}
export default Parent;
Child.js
import React, {useContext} from 'react';
import {ExampleContext} from './Parent';
function Child(){
const { isConnected } = useContext(ExampleContext);
return(
<div>
{<button> Context in Action: { isConnected } </button>}
</div>
)
}
export default Child;
在您的主 App.js 文件中,您将 child.js 渲染为 parent.js
的子级 <Parent>
<Child />
</Parent>