本文共 2966 字,大约阅读时间需要 9 分钟。
在优化后的代码中,我们通过使用 React 的上下文来共享 MobX Store 对象,避免了一层层传递的复杂性。以下是优化后的代码和步骤:
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;
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);};
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'));
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 => (
))}
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 的理念,提升了应用的可维护性和复杂度。
转载地址:http://ktbzz.baihongyu.com/