React + valtio 响应式状态管理

Valtio 是一个很轻量级的响应式状态管理库。valtio 让数据管理在 React 和原生 JS (Vanilla) 中变得更加简单的一个库,它类似于 Vue 的数据驱动视图的理念,使用外部状态代理去驱动 React 视图来更新。

React + Valtio

一、状态管理库

  • dispatch 流派(单向数据流-中心化管理):reduxzustanddva
  • 响应式流派(中心化管理):mobxvaltio
  • 原子状态流派(原子组件化管理):recoiljotai

值得一提的是:JotaiZustandValtio 这三个开源状态管理库都是出自一人之手。
zustand 德语 “状态”,jotai 日语 “状态”、valtio 芬兰语 “状态”。
作者叫做 Daishi Kato,他是日本东京人,是个全职开源作者。

二、JotaiZustandValtio 使用对比

  • Zustand
import { create } from "zustand";

const useStore = create((set) => ({
  count: 0,
  inc: () => set((state) => ({ count: state.count + 1 })),
}));

export default function Counter() {
  const count = useStore((state) => state.count);
  const inc = useStore((state) => state.inc);

  return (
    <div>
      {count}
      <button onClick={inc}>+1</button>
    </div>
  );
}
  • Jotai:每个状态都是原子化,用法和原生的 useState 有点像
import { atom, useAtom } from "jotai";

const countAtom = atom(0);

function Counter() {
  const [count, setCount] = useAtom(countAtom);

  return (
    <div>
      {count}
      <button onClick={() => setCount((v) => v + 1)}>+1</button>
    </div>
  );
}
  • Valtio:和 Vue 的响应式类似,当数据发生变化的时候就驱动视图更新
const state = proxy({
  dur: 10,
  count: 1102
});
const incDur = () => {++state.dur};
const decDur = () => {--state.dur};
const incCount = () => {
  ++state.count;
  setTimeout(incCount, 100 * state.dur);
};

incCount();

export default function Main() {
  const snap = useSnapshot(state)

  return (
      <div>
        <h3>{snap.dur}</h3>
        <button
            disabled={snap.dur <= 1}
            onClick={decDur}>
          -
        </button>
        <button
            disabled={snap.dur >= 10}
            onClick={incDur}>
          +
        </button>
      </div>
  );
}

三、Valtio 状态管理最佳实践

  1. 创建一个 store.js 文件
import { proxy } from 'valtio'
import { useProxy } from 'valtio/utils'
import { cloneDeep } from 'lodash-es'

export const defaultData = {
  activeIndex: 0,
  rangeData: [5, 20],
  baseSelected: [],
  step: {
    1: true,
    2: false,
    3: false,
    4: false,
    5: false,
    6: false,
  },
}

const state = cloneDeep(defaultData)
const store = proxy(state)

export const useStore = () => {
  return useProxy(store)
}

export function resetData() {
  Object.entries(defaultData).forEach(
    ([key, value]) => {
      store[key] = cloneDeep(value)
    }
  )
}
  1. 在组件中使用
import { useStore, resetData } from '@/store/store'

const tabs = [
  {
    value: '1',
    label: '基础设置',
  },
  {
    value: '2',
    label: '高级设置',
  },
  {
    value: '3',
    label: '其他设置',
  }
]

const list = [
  {
    value: '1',
    label: '标签'
  },
  {
    value: '2',
    label: '分类'
  },
  {
    value: '3',
    label: '作者'
  },
]

export default function Main() {
  const store = useStore()

  useEffect(() => {
    return () => {
      // 在组件卸载的时候重置数据
      resetData()
    }
  }, []);

  function onSelect(id) {
    if (store.baseSelected.includes(id)) {
      store.baseSelected =
          store.baseSelected.filter(
              (item) => item !== id
          )
    } else {
      if (store.baseSelected.length >= 5) return
      store.baseSelected.push(id)
    }
  }
    
  return (
    <div>
      {
        tabs.map(({ value, label }, index) => (
          <div
            key={value}
            onClick={() => {
              store.activeIndex = index
            }}
          >
            {label}
          </div>
        ))
      }
      <hr/>
      {
        list.map(({ value, label }) => (
          <div
            key={value}
            onClick={() => {
              onSelect(value)
            }}
          >
            {label}
          </div>
        ))
      }
    </div>
  );
}

useProxy 其实就是对取 useSnapshot()store 数据的封装,这个 hook 也很简单,就是判断是渲染期间(渲染体内)就返回 useSnapshot() 的快照数据,非渲染期间(非渲染体内)就返回原始的 store 数据,和我们自己手写的是差不多的,只不过这个 hook 帮我们把这个过程封装了起来。

官方文档:https://valtio.pmnd.rs/


欢迎访问:天问博客

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React是一个用于构建用户界面的JavaScript库,而Ant Design是一个基于React的UI组件库。结合React和Ant Design可以快速开发出美观、高效的后台管理系统。 React提供了一种声明式的编程模式,通过组件化的方式构建用户界面。Ant Design则提供了丰富的UI组件,包括表单、表格、按钮、导航等等,可以帮助开发者快速搭建出功能完善的后台管理系统。 在使用React+Ant Design开发后台管理系统时,一般的步骤如下: 1. 创建React项目:使用脚手架工具(如create-react-app)创建一个新的React项目。 2. 安装Ant Design:通过npm或yarn安装Ant Design库。 3. 引入Ant Design组件:在需要使用的地方引入所需的Ant Design组件,例如导航栏、表格等。 4. 构建页面布局:使用Ant Design提供的栅格系统和布局组件构建页面的整体布局。 5. 开发业务组件:根据需求开发各个业务组件,例如用户管理、订单管理等。 6. 处理数据流:使用React状态管理库(如Redux)来管理应用的状态和数据流。 7. 添加路由:使用React Router来实现页面之间的跳转和路由控制。 8. 样式定制:根据需求对Ant Design提供的组件进行样式定制,使其符合项目的设计风格。 9. 运行和部署:在开发过程中,使用npm或yarn运行项目进行调试。最后,使用打包工具(如webpack)将项目打包成静态文件,并部署到服务器上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值