首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

无法使用Recoil Recoil赋值给#<Object>的只读属性

基础概念

Recoil 是一个用于 React 应用的状态管理库,由 Facebook 开发。它提供了一种简单而强大的方式来管理全局状态,并且与 React 的组件生命周期紧密结合。Recoil 的核心概念包括原子(Atoms)、选择器(Selectors)和状态容器(State Container)。

相关优势

  1. 简单易用:Recoil 提供了简洁的 API,易于上手。
  2. 性能优化:通过细粒度的状态管理,可以减少不必要的组件重新渲染。
  3. 与 React 生态无缝集成:充分利用 React 的 Hooks 和 Context API。
  4. 支持复杂状态逻辑:通过选择器可以实现复杂的状态计算和派生状态。

类型与应用场景

  • Atoms:用于存储基本状态,类似于 Redux 中的 reducers。
  • Selectors:用于从 atoms 或其他 selectors 中派生出新的状态,支持记忆化(memoization)以提高性能。

应用场景包括但不限于:

  • 全局配置管理
  • 用户认证状态
  • 复杂的数据过滤和计算

遇到的问题及原因

你遇到的问题是“无法使用 Recoil 赋值给 #<Object> 的只读属性”。这通常是因为尝试直接修改一个不可变对象或只读属性。

解决方法

  1. 确保使用可变对象:在 Recoil 中,应该始终使用可变对象来存储状态。
  2. 使用正确的更新方法:Recoil 提供了 useSetRecoilState 钩子来更新状态,而不是直接赋值。

示例代码

假设我们有一个原子 userState,它存储了一个用户对象:

代码语言:txt
复制
import { atom, useSetRecoilState } from 'recoil';

const userState = atom({
  key: 'userState',
  default: { name: 'John', age: 30 },
});

function UserProfile() {
  const setUser = useSetRecoilState(userState);

  const handleUpdateName = () => {
    // 正确的更新方式
    setUser(prevUser => ({ ...prevUser, name: 'Jane' }));
  };

  return (
    <div>
      <p>Name: {userState.name}</p>
      <button onClick={handleUpdateName}>Change Name</button>
    </div>
  );
}

在这个例子中,setUser 函数接收一个回调函数,该回调函数接收前一个状态并返回一个新的状态对象。这种方式确保了状态的不可变性,并且避免了直接修改只读属性的问题。

总结

通过使用 Recoil 的正确更新机制,可以有效避免对只读属性的非法赋值问题。始终使用 useSetRecoilState 并遵循不可变数据的原则,可以确保应用的稳定性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

各流派 React 状态管理对比和原理实现

比如我只是修改一下按钮状态,我就需要修改 actions、reducers、actionTypes 等文件,还要在 connect 的地方暴露给组件来使用。这对于后期维护也是一件很痛苦的事情。..."; 如果在对象里面使用 get,那就是计算属性了。计算属性一般使用 get 来实现,当依赖的属性发生变化的时候,就会重新计算出新的值,常用于一些计算衍生状态。...维护的全局 Store,Recoil 则是使用了分散式的 Atom 来管理,方便进行代码分割。...Recoil 将状态设置为只读,它希望我们可以通过 merge 的形式来修改状态,从而来保证数据的不可变更。 ​...6.9 原理 Recoil 的大致原理是这样的: 创建一个 atom 对象 使用 selector 的时候,会通过 get 来获取到依赖的 atom,生成一个 Map 映射关系 使用 useRecoilState

3K61
  • 2023再谈前端状态管理

    三大原则 此外,Redux 还遵循三大原则: 单一数据源 整个应用的 全局 state被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store中。...state 是只读的 唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。...使用 redux,开发者要编写大量和业务逻辑无关的模板代码,这给开发和后期维护都带来了额外的成本; 大状态量情况下,性能较差。state 更新会影响所有组件。...Mobx的学习成本更低,没有全家桶。 Mobx在更新state中深层嵌套属性时更方便,直接赋值就好了,redux则需要更新所有途经层级的引用(当然搭配immer也不麻烦)。...,无法存储多个各自拥有消费者的值的集合 设计思想 Recoil的状态集是一个有向图 (directed graph),正交且天然连结于React组件树。

    95710

    聊聊两个状态管理库 Redux & Recoil

    尽管如此, Redux 还有有一些天然的缺陷: 概念比较多,心智负担大。 属性要一个一个 pick,计算属性要依赖 reselect。还有魔法字符串等一系列问题,用起来很麻烦容易出错,开发效率低。...MyContext.Consumer> {value => /* render something based on the context value */} 给父节点加...对于使用 useContext 的组件,最突出的就是问题就是 re-render. 不过也有对应的优化方案: React-tracked....Recoil Recoil.js 提供了另外一种思路, 它的模型是这样的: 在 React tree 上创建另一个正交的 tree,把每片 item 的 state 抽出来。...不过我认为,这是一种模式上的改变,recoil 鼓励把每一个状态做的足够小, 任意组合,最小范围的更新。

    3.6K10

    从 Recoil 到 Jotai(下)

    接着上一篇,我们来聊聊 Recoil 到 Jotai,由于下篇属于 高级用法,我会穿插一些原理以及个人的想法(有错误可以指正)。...和 jotai 的还是有一些区别的,可以看到代码中, recoil 内部有 get 方法可以直接获取到多个原子的状态。...atom 具备四个能力: 原始原子(拥有初始值,仅作存储,可以随意塞值) 读原子 写原子 读写原子 其实这里在使用上还是有困惑点的,也就是 selectAtom 的能力其实仅仅就是个派生+监听+equal...简单理解就是:根据请求的 param 去作 Map 存储,当相同的时候就从缓存里拿,不再重新创建新的原子,这个时候 params 为 object 时候,尤为有效。...,jotai 的组合看起来更便捷,但是 recoil 同样方便,直接使用特定的 API 集成。

    22210

    Facebook 新一代 React 状态管理库 Recoil

    Recoil 现在还处于实验阶段,现在已经在 Facebook 一些内部产品中用于生产环境。毕竟是官方推出的状态管理框架,之前没时间仔细研究,借着国庆期间看了看,给大家分享一下。...并且,它们并不能访问 React 内部的调度程序,而 Recoil 在后台使用 React 本身的状态,在未来还能提供并发模式这样的能力。...基础使用 初始化 使用 recoil 状态的组件需要使用 RecoilRoot 包裹起来: import React from 'react'; import { RecoilRoot, atom...异步状态 Recoil 提供了通过数据流图将状态和派生状态映射到 React 组件的方法。真正强大的功能是图中的函数也可以是异步的。这使得我们可以在异步 React 组件渲染函数中轻松使用异步函数。...使用 Recoil ,你可以在选择器的数据流图中无缝地混合同步和异步功能。只需从选择器 get 回调中返回 Promise ,而不是返回值本身。

    1.6K10

    React知识图谱

    useImperativeHandle useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值。使用场景如Antd4 Form实现Form的时候。...recoil:融合React自身(目前还处于实验阶段) recoil是Facebook开发的状态管理库,目标是做一个高性能的状态管理库,并且可以使用React内部的调度机制,包括会支持并发模式。...以上三者对比 redux是集中式管理state,而recoil和mobx都是分散式。 recoil中状态的读写都是Hooks函数,目前没有提供类组件的使用方式。...recoil是Facebook开发的,可以使用React内部的调度机制,这是redux和mobx不支持的。 recoil目前还是实验阶段,想要应用到的自己的项目中,等待正式版发了再说吧。...Redirect 渲染 将使导航到一个新的地址。 Link 跳转组件 NavLink 一个特殊版本的 Link,当它与当前 URL 匹配时,为其渲染元素添加样式属性。

    38420

    iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值

    在上篇博客《iOS开发之使用Runtime给Model类赋值》中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property Name...相同,然后通过运行时来生成和执行Setter方法给Model类的属性赋值。   ...通过Runtime来给Model类属性赋值的好处是多多的,它便于代码的后期维护,并且提高了开发效率。...当你拿到解析后的字典时你不用一个一个的通过key去把字典的值赋值给相应的Model类的属性,本篇博客中会给出如何去遍历Model中属性的值,并且给出字典的Key和Model的属性名不一样的情况我们该如何负值...,字典的key与要赋值Model的属性不同,下面的循环就是要生成测试使用的数据: 1 //生成Dic的Key与Model的属性不一样的字典。

    2.1K70

    如何在 React 应用中使用 Hooks、Redux 等管理状态

    如何改变状态的对象,它必须包含一个 type 属性,并且它还可以包含一个可选的 payload 属性 实现 Redux,我们的示例应用程序如下所示: // App.js import '....使用 Recoil,我们的示例应用程序将如下所示: // App.js import countState from './recoil/counter.atom' import '....首先我们通过运行 npm install recoil 来安装它 那些使用 recoil 状态的组件需要在其父组件的某处使用 RecoilRoot,所以我们用它来包装我们的应用程序 Recoil 仍然是一种实验性的,并没有被广泛使用,但你可以看到世界各地的开发人员将如何转向这个工具。 Jotai Jotai 是一个为 React 构建的开源状态管理库,其灵感来自 Recoil。...它与 Recoil 的不同之处在于寻找一个更加简约的 API -- 它不使用字符串键,而且是面向 TypeScript 的。 与 Recoil 一样,Jotai 使用 atoms。

    8.5K20

    细聊Concent & Recoil , 探索react数据流的新开发模式

    不过当我体验完recoil后,我对其中标榜的精确更新保持了怀疑态度,有一些误导的嫌疑,这一点下文会单独分析,是否属于误导读者在读完本文后自然可以得出结论,总之本文主要是分析Concent与Recoil的代码风格差异性...对Recoil是有野心并给予厚望的。...[r1.png] Recoil初体验 我们以常用的counter来举例,熟悉一下Recoil暴露的四个高频使用的api atom,定义状态 selector, 定义派生数据 useRecoilState...dispatch调用方式 //ctx.dispatch('inc', 10); // or ctx.dispatch('asynInc', 10) 异步计算函数 run接口里支持扩展computed属性...,最终还是把业务处理数据交回给react组件调用其setState或forceUpdate触发重渲染,current mode的引入并不会对现有的状态管理或者新生的状态管理方案有任何影响,仅仅是对用户的

    1.7K2414

    ModuleFederation原理分析及发散

    这方面又跟我们的单页应用很像了。这边不是限制只有recoil才可以,经我实测redux,mobx都可以正常使用。 Webpack为我们做了什么?...recoil,如果这个recoil版本满足剩下的那个的要求,剩下的那个远程模块就会直接使用这个已经加载好的recoil。...它既能给我们提供类似micro site一样的开发体验,又能带来spa提供的测试与使用体验,这是两者单独都很难做到的。未来可期,后面社区越来越多人拥抱它之后,一定还会开发出其它更有意思的使用方法。...就目前来看,把基础依赖完全通过运行时动态请求可能不是很好的选择,比如基础组件库,在这种场景下我们可以同时构建npm包跟远程模块,然后优先使用远程模块,在远程模块无法使用时再转而使用应用打包时依赖的npm...另外一些通用的代码,想要分享给更多人而不仅仅是内部业务使用的代码,比如React啊,axios啊,这种框架跟工具包等等,npm包还是最好的选择。

    2.4K10

    React-全局状态管理的群魔乱舞

    而接下来,我们来分析一下React中状态管理的新贵 Recoil[1] Jotai[2] Zustand[3] Valtio[4] 等库中所涉及的设计理念和心智模式。...特别是当用户从低配设备上访问这些大型应用程序时,数据增大,设备无法及时进行数据回收,就导致了应用卡顿等性能问题。 利用React「生命周期」来存储状态意味着更容易利用组件卸载时的「自动垃圾收集」。...useSyncExternalStore 这个 hook 并不是给我们在日常项目中用的,它是给第三方类库如 Redux、Mobx 等内部使用的。...在这种情况下,React 无法调和两个独立的上下文。...❞ 像Recoil和Jotai这样的流行库以其 「原子状态」的概念体现了这种自下而上的理念。 ❝「原子是一个最小但完整的状态单位」。它们是小块的状态,可以连接在一起形成新的衍生状态。

    3.8K20

    Rust 赋能前端-开发一款属于你的前端脚手架

    当我们使用 #[derive] 属性时,编译器会为指定的类型自动实现这些trait的功能。...它自动为枚举实现了括号内指定的多个trait。 「Clone」: 允许这个枚举的实例被复制。 「Copy」: 允许这个枚举的实例在赋值时被复制(与Clone相似,但适用于更简单的值)。...name属性描述了参数的名称。 help属性提供了关于此标记的帮助信息。 requires指明了该标记需要与xx参数一起使用。 类型为bool,表示这个参数是一个布尔标志。...❝由于篇幅有限,我们将ui/hook/state的处理逻辑给折叠了,这块的处理逻辑和css是类似的。 ❞ 从函数签名中我们可以看出,大多数参数都是Option类型,表示它们是可选的。...但是呢,这里和其他的还有一点不一样的地方就是,这是要修改json文件,我们可以借助serde_json[8]将json文件解析成类似Object/Map的数据类型,然后通过xx.get_mut/insert

    63220

    Jotai 实战(上)

    早前,我们介绍了《从 Recoil 到 Jotai》 的迁移。其实随着迁移的过程中,也有着一些实践性的好方法,这里做一个总结提炼。...1. atom 细粒度作用域控制 目的:实现不同层级的状态管理,例如:组件层、页面层、应用层 的细粒度控制。...实现方案 在不同的作用域层级添加 Provider ,作为隔离效果,还有一个好处是:当重新加载时,挂在 Provider 的所有 Atom 会被重置状态。后者才是最为好用的一个能力。...重点:使用 useAtomCallback 时,必须在整个组件上下文中去 subscribe atom ,简单点就是 useAtom 或者 useAtomValue,否则无法 get 最新的内容。...但是 atomFamily 我们在 下篇介绍过,会存在内存泄漏的风险,因为内部使用了 Map 作为不自动回收的存储数据结构。

    17110

    JavaScript 对象可以做到的三件事

    作者:John Au-Yeung 译者:前端小智 来源:medium 除了普通的对象属性赋值和遍历之外,我们还可以使用 JavaScript 对象执行许多其他操作。...在本文中,我们将了解如何使用它们,包括访问内部属性、操作属性描述符和继承只读属性。 1. 访问内部属性 JavaScript 对象无法以常规方式访问的内部属性。...: true, configurable: true, }); 这样当我们尝试给 foo.a 赋值时,如: foo.a = 2; 如果关闭了严格模式,浏览器将忽略,否则将抛出一个错误,因为我们将 writable...3.无法分配继承的只读属性 继承的只读属性不能再赋值。这是有道理的,因为我们这样设置它,它是继承的,所以它应该传播到继承属性的对象。...我们可以使用defineProperty更改属性的属性描述符,它还用于添加新属性及其属性描述符。 最后,继承的只读属性保持只读状态,这是有道理的,因为它是从父原型对象继承而来的。

    71940
    领券