- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚开始在一个新项目中使用 Recoil,我不确定是否有更好的方法来完成它。
我的应用程序是一个基本编辑包含对象数组的 JSON 文件的界面。它读入文件,根据特定属性将对象分组到选项卡中,然后用户可以浏览选项卡,查看每个选项卡的几百个值,进行更改,然后保存更改。
我正在使用反冲,因为它允许我从我的应用程序中的任何位置访问每个输入的状态,这使得保存更容易 - 理论上...
为了为 JSON 文件中的每个对象生成状态,我创建了一个返回 null
的组件,我映射到初始数组,创建组件,它使用AtomFamily,然后还将 ID 保存到另一个 Recoil 状态,这样我就可以保留所有内容的列表。
问题 1 这是更好的方法吗? null
组件感觉不对,但将整个数组存储在单个状态中会导致在每次按键时重新呈现所有内容。
为了保存数据,我有一个调用函数的按钮。该函数只需要获取 ID,遍历它们,获取每个 ID 的状态,然后将它们插入数组。我也使用 Selector 完成了此操作,但问题是由于 Hooks 规则,我无法从函数调用 getRecoilValue - 但如果我将值提供给父组件,它会再次减慢一切。
问题 2 我很确定我错过了考虑存储状态和使用 Hook 的正确方法,但我还没有找到这个特定用例的任何示例 - 需要生成前面的状态,然后在保存时再次访问它。有什么指导吗?
最佳答案
习惯空渲染组件,你几乎无法使用 Recoil 避免它们,更一般地说,这个 hooks-first React 世界 😉
关于函数内的 useRecoilValue
:你是对的,你应该利用 useRecoilCallback
来完成这类任务。使用 useRecoilCallback
,您有一个中心点,您可以在其中立即获取和设置您想要的任何内容。看看这个working CodeSandbox我试图复制(最简单的方式)你的用例。 SaveData
组件(不需要专用组件,您可以只公开 Recoil 回调而无需创建临时组件)如下
const SaveData = () => {
const saveData = useRecoilCallback(({ snapshot }) => async () => {
const ids = await snapshot.getPromise(carIds);
for (const carId of ids) {
const car = await snapshot.getPromise(cars(carId));
const carIndex = db.findIndex(({ id }) => id === carId);
db[carIndex] = car;
}
console.log("Data saved, new `db` is");
console.log(JSON.stringify(db, null, 2));
});
return <button onClick={saveData}>Save data</button>;
};
如你所见:
它通过 const ids = await snapshot.getPromise(carIds);
它使用 ID 从原子家族中检索所有汽车 const car = await snapshot.getPromise(cars(carId));
所有这些都集中在一个中心点,没有钩子(Hook),也没有订阅原子更新的组件。
您的用例有几种方法:
在应用启动时创建空原子,更新它们并在最后保存它们。这是什么my CodeSandbox does
做同样的事情,但通过 RecoilRoot
' initialState
prop 初始化原子
Recoil 正在更新每个原子的变化。这可以通过 useRecoilTransactionObserver
实现但请注意,它目前被标记为不稳定。很快就会有一种新的方法来做同样的事情(我猜),但目前这是唯一的解决方案
后者是“更聪明”的方法,但它实际上取决于您的用例,您是否真的想在每个原子更新时更新 JSON 取决于您 😉
希望对你有帮助,如果我遗漏了什么,请告诉我😊
关于reactjs - 使用 Recoil 创建和读取数千个项目的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63038077/
我正在尝试创建一个动态表单,其中表单输入字段是根据 API 返回的数据呈现的。 由于 atom 需要有一个唯一的键,我尝试将它包装在一个函数中,但每次我更新字段值或组件重新安装(尝试更改选项卡)时,我
我正在尝试创建一个动态表单,其中表单输入字段是根据 API 返回的数据呈现的。 由于 atom 需要有一个唯一的键,我尝试将它包装在一个函数中,但每次我更新字段值或组件重新安装(尝试更改选项卡)时,我
我可以将 Recoil 原子的默认值设置为对象吗? 例如。: export const currentUserState = atom({ key: 'currentUserState', d
我正在测试 Recoil,我需要管理要在主页上显示的帖子列表。 我的第一个想法是把所有的帖子都做成一个大原子,但这似乎有点暴力,因为我们可以直接在首页上编辑帖子。 我的第二个想法是动态生成带有前缀的原
我正在我目前正在构建的 React 框架中试验 Recoil。在我的用例中,应用程序将根据用户事件生成一个操作对象,然后将其发送到服务器,从服务器获取应用程序状态。 Action 存储在反冲 atom
根据文档, https://recoiljs.org/docs/api-reference/core/RecoilRoot 接受 Prop 为 initializeState?: (MutableSn
我刚开始在一个新项目中使用 Recoil,我不确定是否有更好的方法来完成它。 我的应用程序是一个基本编辑包含对象数组的 JSON 文件的界面。它读入文件,根据特定属性将对象分组到选项卡中,然后用户可以
根据文档, https://recoiljs.org/docs/api-reference/core/RecoilRoot 接受 Prop 为 initializeState?: (MutableSn
我刚开始在一个新项目中使用 Recoil,我不确定是否有更好的方法来完成它。 我的应用程序是一个基本编辑包含对象数组的 JSON 文件的界面。它读入文件,根据特定属性将对象分组到选项卡中,然后用户可以
我正在尝试了解 React Recoil 以及更新后的原子值何时可用,或者如何使新值在应用程序中垂直和水平传播。 例如,如果我有一个名为 userState 的原子,并且我更新了它的一个属性,如 av
我正在尝试了解 React Recoil 以及更新后的原子值何时可用,或者如何使新值在应用程序中垂直和水平传播。 例如,如果我有一个名为 userState 的原子,并且我更新了它的一个属性,如 av
我正在使用 Recoil,我想从实用程序函数内访问组件外部的存储(获取/设置)。 更一般地说,人们如何编写可重用函数来使用 Recoil 操纵全局状态?使用 Redux,我们可以直接将事件分派(dis
现状 我正在使用 Recoil在 React 中管理状态应用。我正在使用 Atom Effects使用 API 备份反冲值。 当我的 Atom 检测到身份验证 token 有问题时,我希望它以某种方式
我正在尝试将 RecoilJS 中原子的默认值设置为异步 API 调用的值。我这样做是为了当某个 React 组件呈现时,它将拥有数据库中的所有当前集合,而无需调用 useEffect()。这是我的代
我是 Recoil.js 的新手,我在应用程序中为登录用户提供了以下原子和选择器: const signedInUserAtom = atom({ key: 'signedInUserAtom
我正在运行一些 react-testing-library 测试并收到警告 Did not retain recoil value on render, or committed after time
我得到的错误是,无法删除[对象数组]类型的属性“%1”错误:无法在ObserverProxy处删除[对象数组]的属性“%1”。取消订阅(http://localhost:3000/static/js/
我是一名优秀的程序员,十分优秀!