javascript - 无法在 mobx 中的操作中获取 ajax 调用的值,而是获得代理
问题描述
我刚学了Mobx,
我有这个简单的设置,我的商店有一些东西,比如:
selectedFood: "pizza"
以及一些执行诸如更改所选值之类的功能:
selectFood: (food) => store.selectedFood = food,
这是我的基本商店:
const StoreProvider = ({children}) => {
const store = useLocalStore(() => ({
selectedFood: "pizza",
selectFood: food => store.selectedFood = food,
restaurantResults: [],
getRestaurnts: () => {
fetchRestaurants('pizza')
.then(res => store.restaurantResults.push(res))
},
}))
return <StoreContext.Provider value={store} >{children}</StoreContext.Provider>
}
然后在我的组件上,当用户单击按钮时,我会做两件事,将 selectedFood 更改为用户单击的任何内容,并进行 ajax 调用以从 api 获取一些食物:
const RestaurantsChooser = () => {
const store = React.useContext(StoreContext);
function handleClick(food) {
store.selectFood(food);
store.getRestaurants(food);
}
return useObserver(() => (
<div className="pa2">
<p>{store.selectedFood}</p>
<button onClick={e => handleClick(e.target.value)} value="pizza" className="pa2 bn br2 mh1">Pizza</button>
<button onClick={e => handleClick(e.target.value)} value="burger" className="pa2 bn br2 mh1">Burger</button>
<button onClick={e => handleClick(e.target.value)} value="sushi" className="pa2 bn br2 mh1">Sushi</button>
<div className="flex">
{store.restaurantResults.map((rest, i) => {
return (
<div key={i} className="pa2">
<img src={rest.image_url} alt="restuarant"/>
<p>{rest.name}</p>
<p>Reviews{rest.review_count}</p>
</div>
)
})}
</div>
</div>
));
};
但是当我尝试循环时,store.restaurantResults
我得到一个代理而不是结果,但是如果getRestaurnts
在我商店的函数上我控制台fetchRestaurants
结果的响应在那里,但不知何故它们没有传递给我的组件。
我想我需要对商店中的 ajax 调用做一些事情,因为它是异步的,但我在文档中只能找到这个链接:https ://mobx.js.org/best/actions.html ,它讨论了与类,看起来与我的设置完全不同,知道如何解决这个问题吗?
谢谢。
解决方案
getRestaurants
是否是 a并不重要, mobx action
因为您正试图restaurantResults
从异步运行的代码(初始之外)修改 observable ( action
) 因此,在从异步调用中获得结果后,您需要在 observable 内部运行修改mobx 动作。您可以使用runInAction
mobx 实用程序功能。
getRestaurnts: () => {
fetchRestaurants('pizza')
.then(res =>
runInAction(()=>{
store.restaurantResults.push(res)
})
)
},
您可以在官方文档中阅读更多如何使用异步代码和 mobx 。
推荐阅读
- android - Ionic run android - 评估 CordovaLib 时出错
- sql - 使用多行文本框进行用户输入,而不是单行 VB.net
- reactjs - jsx 传递给 react-dom/server renderToString
- c# - Microsoft Graph 示例中的 DI 范围:aspnetcore-connect-sample
- javascript - D3js v5 分组条形图数据 x.domain 标签和数据分离
- git - “Git checkout branch1”突然合并从 branch2 到 branch1 的更改,而不是警告我先提交
- nlp - OpenNLP 中的 NER 训练是否存在“最佳”标记化?
- python - 使用 python-opencv 拍摄的网络摄像头照片很暗
- java - HQL 查询使用有效的 SQL 查询抛出 QueryException
- php - 未捕获的 ArgumentCountError:函数 wc_get_page_id() 的参数太少