我有一个获取服务,该服务异步获取新数据,并且想在获取新数据时更新组件。
为简化起见,假设这是我的设置:
class SomeService {
static data;
// can be called by other components (asynchronous)
static fetchData = async () => {
data = await someAsynchronousCall() // data gets a new value
};
}
const HomeScreen = () => {
useEffect(() => {
console.log('new data is: ' + SomeService.data);
}, [SomeService.data]); // I want to trigger this once data changes
return <View> ... </View>
};
我已经尝试过类似的操作,但是当data
发生更改时,useEffect
不会被调用。
有没有办法获得想要的行为?
答案 0 :(得分:4)
useEffect监听状态更新。 SomeService.data是静态变量。您应该使用Hooks实现类似的操作。
import sequtils
let list = @[1, 2, 4]
echo list.filter do (x: int) -> bool: x > 2
答案 1 :(得分:1)
useEffect
默认在每个渲染之后运行(如果没有第二个参数)。 useEffect
的第二个参数用于检查是否应该重新运行,不要触发useEffect
运行。
在您的情况下,您的static data
可能会更改,但是没有什么可以使您的组件重新呈现,因此您的useEffect
函数将无法运行。
您可以将数据设置为 state ,以使其重新呈现。或者,只要您的静态数据发生更改,就会以某种方式触发重新渲染。
答案 2 :(得分:1)
您可以使用上下文api将获取逻辑与组件分开。
import React from 'react'
const DataContext = React.createContext()
function DataProvider({children}) {
const [data, setData] = React.useState()
React.useEffect(() => {
const fetchData = async () => {
const data = await someAsynchronousCall()
setData(data)
};
fetchData()
}, [])
return (
<DataContext.Provider value={data}>
{children}
</CountStateContext.Provider>
)
}
export {DataProvider, DataContext}
在您的组件中,使用useContext来获取数据
const HomeScreen = () => {
const data = useContext(DataContext)
useEffect(() => {
console.log('new data is: ' + SomeService.data);
}, [data]); // I want to trigger this once data changes
return <View> ... </View>
};
并将您的应用包装在DataProvider中
const App = props => {
<DataProvider>
<HomeScreen />
{/* other component */}
</DataProvider>
}