
MobX 学习 - 04 TodoList 案例
发布日期:2021-05-08 18:18:42
浏览次数:15
分类:精选文章
本文共 2966 字,大约阅读时间需要 9 分钟。
在优化后的代码中,我们通过使用 React 的上下文来共享 MobX Store 对象,避免了一层层传递的复杂性。以下是优化后的代码和步骤:
优化后的代码
1. TodoListStore.js
import { makeObservable, observable, action } from "mobx";import TodoViewStore from "./TodoViewStore";class TodoListStore { todos = []; constructor(todos) { if (todos) this.todos = todos; makeObservable(this, { todos: observable, createTodo: action }); } createTodo(title) { this.todos.push(new TodoViewStore(title)); }}export default TodoListStore;
2. TodoListStoreProvider.js
import { createContext, useContext } from 'react';import TodoListStore from './TodoListStore';const TodoListStoreContext = createContext();const TodoListStoreProvider = ({ store, children }) => { return ({children} );};export { TodoListStore, TodoListStoreProvider, useTodoListStore };const useTodoListStore = () => { return useContext(TodoListStoreContext);};
3. App.js
import React from 'react';import ReactDOM from 'react-dom';import App from './App';import './index.css';import { TodoListStoreProvider } from './stores/TodoStore/TodoListStore';ReactDOM.render(, document.getElementById('root'));
4. TodoListView.js
import TodoHeader from "./TodoHeader";import TodoFooter from "./TodoFooter";import TodoView from "./TodoView";import { observer } from 'mobx-react-lite';import { useTodoListStore } from '../../stores/TodoStore/TodoListStore';function TodoListView() { const todoListStore = useTodoListStore(); return ();}export default observer(TodoListView); {todoListStore.todos.map(todo => (
))}
5. TodoHeader.js
import { useState } from 'react';import { useTodoListStore } from '../../stores/TodoStore/TodoListStore';function TodoHeader() { const [title, setTitle] = useState(''); const todoListStore = useTodoListStore(); return ();}export default TodoHeader; todos
setTitle(event.target.value)} onKeyUp={(event) => { if (event.key === 'Enter') { todoListStore.createTodo(event.target.value); setTitle(''); } }} />
优化步骤
创建上下文共享数据
- 在
TodoListStore.js
中,导入 React 的上下文工具,并创建一个上下文对象TodoListStoreContext
。 - 使用
TodoListStoreProvider
组件,将TodoListStore
上下文包裹起来,供下级组件访问。 - 提供一个
useTodoListStore
钩子函数,帮助组件快速访问上下文中的TodoListStore
实例。
在 App.js 中使用上下文
- 在主应用组件
App.js
中,使用TodoListStoreProvider
将TodoListStore
上下文共享给所有子组件。 - 移除直接传递
todoListStore
的属性,改用上下文获取。
优化 TodoListView 组件
- 移除不必要的属性传递,直接使用
useTodoListStore
获取上下文中的TodoListStore
实例。 - 进一步简化组件结构,提升可读性和维护性。
优化 TodoHeader 组件
- 移除直接使用
createTodo
方法的属性传递,改用useTodoListStore
获取TodoListStore
实例。 - 在输入事件中调用
createTodo
方法,确保新增待办事项的功能正常。
优化效果
- 简化组件结构:减少了不必要的属性传递,组件间的耦合度降低。
- 提高可维护性:通过上下文共享数据,避免了状态传递的复杂性,易于管理和扩展。
- 提升性能:减少了跨层次的状态传递,提高了组件间的响应速度和效率。
这种方法通过 React 的上下文机制,将 MobX 的状态管理逻辑封装在 Store 中,组件间只关注数据展示和业务逻辑,实现了 clean architecture 的理念,提升了应用的可维护性和复杂度。
发表评论
最新留言
很好
[***.229.124.182]2025年03月25日 11时47分27秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Asp.NET Core 限流控制-AspNetCoreRateLimit
2019-03-06
gRPC在 ASP.NET Core 中应用学习(一)
2019-03-06
@SuppressWarnings 用法
2019-03-06
看完你就明白的锁系列之锁的状态
2019-03-06
看完这篇操作系统,和面试官扯皮就没问题了
2019-03-06
我的价值观
2019-03-06
真香!Linux 原来是这么管理内存的
2019-03-06
一文详解 Java 并发模型
2019-03-06
阅站无数!不过我只推荐下面这些
2019-03-06
值类型与引用类型(中)
2019-03-06
MSSQL 2005 数据库变成可疑状态
2019-03-06
QBlog V2.5 源码开放下载(ASP.NET 番外系列之开端)
2019-03-06
秋色园引发CPU百分百命案的事件分析与总结
2019-03-06
安装jdk并配置环境变量
2019-03-06
稀疏数组
2019-03-06
js的严格模式
2019-03-06
ETL工具-KETTLE教程实例实战1----术语和定义
2019-03-06
idea的安装和无限期试用
2019-03-06
Oracle VM VirtualBox安装PVE虚拟机
2019-03-06
【转】如何用css限制文字长度,使溢出的内容用省略号…显示
2019-03-06