在 React 函数式组件中使用 MobX

🌟 MobX 是一个简洁的状态管理库📚,它通过透明的函数响应式编程(TFRP)🔮 使得状态管理变得简单和可扩展。在 React 函数式组件中使用 MobX 可以让我们更轻松地管理组件状态✨。这篇文章将介绍如何在 React 函数式组件中结合使用 MobX 和 mobx-react 包提供的 observer 函数👀 以及 Provider🏭 和 useContext🔗。

安装🛠️

首先,需要确保 mobxmobx-react 已经添加到项目依赖中。

shell 复制代码
npm install mobx mobx-react 📦

定义你的 Store 🗃️

创建一个 store 来存储应用状态📈。

javascript 复制代码
import { makeAutoObservable } from 'mobx';

class TodoStore {
  todos = [];

  constructor() {
    makeAutoObservable(this);
  }

  addTodo(todo) {
    this.todos.push(todo);
  }

  get todoCount() {
    return this.todos.length;
  }
}

export const todoStore = new TodoStore();

使用 ProvideruseContext 提供和使用 Store🔄

通过 Provider 可以将 store 传递到 React 组件树中🌲。然后,使用 React 的 useContext 钩子函数将 store 注入到函数式组件中。

创建一个 context:

javascript 复制代码
import { createContext } from 'react';
import { todoStore } from './TodoStore';

export const StoreContext = createContext(todoStore);

使用 Provider 将 store 提供给组件:

javascript 复制代码
import React from 'react';
import ReactDOM from 'react-dom';
import { StoreContext } from './store';
import App from './App';
import { todoStore } from './TodoStore';

ReactDOM.render(
  <StoreContext.Provider value={todoStore}>
    <App />
  </StoreContext.Provider>,
  document.getElementById('root')
);

在函数式组件中使用 Store🛠️

在函数式组件中,可以通过 useContext 钩子和 observer 函数来使用 store 和响应其变化🌀。

javascript 复制代码
import React, { useState, useContext } from 'react';
import { observer } from 'mobx-react';
import { StoreContext } from './store';

const TodoList = observer(() => {
  const store = useContext(StoreContext);
  const [newTodo, setNewTodo] = useState('');

  const handleInputChange = (e) => {
    setNewTodo(e.target.value);
  };

  const handleFormSubmit = (e) => {
    e.preventDefault();
    store.addTodo(newTodo);
    setNewTodo('');
  };

  return (
    <div>
      <form onSubmit={handleFormSubmit}>
        <input
          type="text"
          value={newTodo}
          onChange={handleInputChange}
        />
        <button type="submit">Add Todo</button>
      </form>
      <ul>
        {store.todos.map((todo, index) => (
          <li key={index}>{todo}</li>
        ))}
      </ul>
      <div>Total Todos: {store.todoCount}</div>
    </div>
  );
});

export default TodoList;

在上述代码中,TodoList 组件通过 useContext 获取到 todoStore🛍️,通过 observer 函数包裹组件以确保组件能响应状态变化🔄。每当状态更新时(如添加了一个 todo)✏️,TodoList 组件会重新渲染以反映最新的状态🔄。

通过使用 MobX、Provider🏭 和 React 的 Context API🔗,我们可以在函数式组件中便利地管理和使用状态✨。

相关推荐
空想兔8 小时前
AgentPulse:实时监控所有的 OpenCode Agent 跑到哪一步了
react.js·ai编程
YIAN8 小时前
React + Zustand + JWT 前端权限体系完整实现:从登录鉴权到路由守卫全流程拆解
前端·react.js·架构
光影少年13 小时前
react navite高频手写/实操题
前端·javascript·react native·react.js·前端框架
梦想的颜色14 小时前
【AI实战】React‑Native + AI 移动端 APP 完整实战全流程|云端 / 本地大模型、Agent 集成、安装配置、避坑指南
react.js·大模型·app·agent·reactnative·expo·ai 应用开发
zzzzzz31018 小时前
react-bits:酷炫动效之外,React 组件库还能提供什么
javascript·react.js·动效
专业抄代码选手1 天前
08|Fiber 上的 `useState`:状态终于属于具体组件
前端·javascript·react.js
BreezeJiang2 天前
为什么生成了 dist,项目还是可能跑不起来?从一个 React + Express + MySQL 项目看部署闭环
nginx·react.js
奴心2 天前
我受够了 value / defaultValue / onChange 三连——一个 prop 重构 React 受控组件
react.js
用户298698530142 天前
React 中 HTML 内容转 Word 文档的实现方案
javascript·react.js·html
浮生望2 天前
React JWT 登录鉴权实战:Zustand 状态管理 + Axios 拦截器 + 路由守卫完整链路
react.js