MobX版todo案例:从入门到精通
2023-12-30 23:53:26
MobX版todo案例:从入门到精通
MobX是一个轻量级、简单易用的状态管理库,它可以帮助我们管理组件状态和实现响应式编程。MobX的API非常简单,这使得它很容易学习和使用。在这篇教程中,我们将从头开始构建一个使用MobX的todo应用。我们将从创建一个新项目开始,然后逐步创建所需的组件和引入必要的依赖项。在理解了MobX的核心概念后,我们将构建MobX工作流,并学习如何使用MobX来管理组件状态和实现响应式编程。
准备工作
在开始之前,我们需要先确保已经安装了Node.js和npm。如果还没有安装,可以从Node.js官网下载安装程序。
创建并初始化一个新项目
首先,我们创建一个新的项目文件夹。可以使用以下命令:
mkdir mobx-todo
cd mobx-todo
然后,我们使用npm初始化一个新的项目。可以使用以下命令:
npm init -y
这将创建一个package.json文件,其中包含了项目的基本信息。
创建所需要的组件
接下来,我们需要创建所需要的组件。我们将创建一个名为app的组件,用于渲染整个应用。我们还将创建三个子组件,分别用于渲染todo列表、todo表单和todo项。
app组件
app组件负责渲染整个应用。它包含了一个todo列表和一个todo表单。可以使用以下代码创建app组件:
import React, { Component } from 'react';
import TodoList from './TodoList';
import TodoForm from './TodoForm';
class App extends Component {
render() {
return (
<div>
<h1>Todo List</h1>
<TodoList />
<TodoForm />
</div>
);
}
}
export default App;
TodoList组件
TodoList组件负责渲染todo列表。它使用了一个MobX的observable数组来存储todo项。可以使用以下代码创建TodoList组件:
import React, { Component } from 'react';
import TodoItem from './TodoItem';
import { observable, autorun } from 'mobx';
class TodoList extends Component {
@observable todos = [];
componentDidMount() {
autorun(() => {
console.log(this.todos);
});
}
render() {
return (
<ul>
{this.todos.map((todo, index) => (
<TodoItem key={index} todo={todo} />
))}
</ul>
);
}
}
export default TodoList;
TodoForm组件
TodoForm组件负责渲染todo表单。它使用了一个MobX的observable值来存储todo项的标题。可以使用以下代码创建TodoForm组件:
import React, { Component } from 'react';
import { observable } from 'mobx';
class TodoForm extends Component {
@observable title = '';
handleSubmit(e) {
e.preventDefault();
this.props.addTodo(this.title);
this.title = '';
}
render() {
return (
<form onSubmit={this.handleSubmit.bind(this)}>
<input
type="text"
value={this.title}
onChange={(e) => { this.title = e.target.value; }}
/>
<button type="submit">Add Todo</button>
</form>
);
}
}
export default TodoForm;
TodoItem组件
TodoItem组件负责渲染todo项。它使用了一个MobX的observable值来存储todo项的状态。可以使用以下代码创建TodoItem组件:
import React, { Component } from 'react';
import { observable } from 'mobx';
class TodoItem extends Component {
@observable completed = false;
handleToggle() {
this.completed = !this.completed;
}
render() {
return (
<li>
<input
type="checkbox"
checked={this.completed}
onChange={this.handleToggle.bind(this)}
/>
<span>{this.props.todo}</span>
</li>
);
}
}
export default TodoItem;
拷贝需要HTML代码
接下来,我们需要拷贝需要HTML代码。可以使用以下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="./styles.css" />
</head>
<body>
<div id="root"></div>
<script src="./bundle.js"></script>
</body>
</html>
拷贝并引入CSS文件
接下来,我们需要拷贝并引入CSS文件。可以使用以下代码:
body {
font-family: sans-serif;
}
h1 {
font-size: 24px;
margin-bottom: 10px;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: flex;
align-items: center;
padding: 10px;
border-bottom: 1px solid #ccc;
}
input[type="checkbox"] {
margin-right: 10px;
}
input[type="text"] {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
}
button {
padding: 10px;
border: 1px solid #ccc;
background-color: #4caf50;
color: white;
cursor: pointer;
}
将三个子组件引入到app组件中
接下来,我们需要将三个子组件引入到app组件中。可以使用以下代码:
import React, { Component } from 'react';
import TodoList from './TodoList';
import TodoForm from './TodoForm';
import TodoItem from './TodoItem';
class App extends Component {
render() {
return (
<div>
<h1>Todo List</h1>
<TodoList />
<TodoForm />
</div>
);
}
}
export default App;
构建MobX工作流
接下来,我们需要构建MobX工作流。可以使用以下代码:
import React, { Component } from 'react';
import { observable, autorun } from 'mobx';
class TodoList extends Component {
@observable todos = [];
componentDidMount() {
autorun(() => {
console.log(this.todos);
});
}
render() {
return (
<ul>
{this.todos.map((todo, index) => (
<TodoItem key={index} todo={todo} />
))}
</ul>
);
}
}
class TodoForm extends Component {
@observable title = '';
handleSubmit(e) {
e.preventDefault();
this.props.addTodo(this.title);
this.title = '';
}
render() {
return (
<form onSubmit={this.handleSubmit.bind(this)}>
<input
type="text"
value={this.title}
onChange={(e) => { this.title = e.target.value; }}
/>
<button type="submit">Add Todo</button>
</form>
);
}
}
class TodoItem extends Component {
@observable completed = false;
handleToggle() {
this.completed = !this.completed;
}
render() {
return (
<li>
<input
type="checkbox"
checked={this.completed}
onChange={this.handleToggle.bind(this)}
/>
<span>{this.props.todo}</span>
</li>
);
}
}
export default TodoList;
使用MobX来管理组件状态和实现响应式编程
最后,我们可以使用MobX来管理组件状态和实现响应式编程。可以使用以下代码:
import React, { Component } from 'react';
import { observable, autorun } from 'mobx';
class TodoList extends Component {
@