返回

MobX版todo案例:从入门到精通

前端

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 {
  @