关于angular:React-入门写个-TodoList-实例

34次阅读

共计 3631 个字符,预计需要花费 10 分钟才能阅读完成。

React 是一个用于构建用户界面的 JavaScript 库,次要特点有:

  • 申明式渲染:设计好数据和视图的关系,数据变动 React 主动渲染,不用亲自操作 DOM
  • 组件化:页面切分成多个小部件,通过组装拼成整体页面,利于代码复用

本文通过写个简略的 TodoList 实例,不求甚解,相熟下 React 的开发过程。

  1. 装置 Node.js

Node.js 是一个运行环境,相似 jdk,用以反对在服务端运行 JavaScript。

您能够在这里下载安装包:

http://nodejs.cn/download/ 

以绿色版装置为例,将 node-v10.16.1-win-x64.zip 解压到 E:software 并命名为 node-v10.16.1

在 Path 环境变量中减少两项:

E:softwarenode-v10.16.1
E:softwarenode-v10.16.1node_global 

在 cmd 中应用 node -v 显示版本号,示意装置胜利。

Node.js 中有个 npm 软件包管理器,能够很不便的治理下载和应用第三方开源包,相似 maven,应用 npm -v 显示版本号,示意 npm 也没有问题。

绿色版装置实现后一些必要的配置:

npm config set prefix "E:softwarenode-v10.16.1node_global" 

设置全局装置的模块存储门路

npm config set cache "E:softwarenode-v10.16.1node_cache" 

设置下载缓存的存储门路

npm config set registry https://registry.npm.taobao.org` 

设置 npm 下载源为淘宝镜像

简略应用:

  • npm install xxx: 装置到我的项目目录
  • npm install -g xxx 装置到全局目录
  • npm install -save xxx: 装置到我的项目目录,并在 package.json 中的 dependencies 节点记录依赖
  • npm install –save-dev xxx: 装置到我的项目目录,并在 package.json 中的 devDependencies 节点记录依赖
  1. 脚手架创立我的项目

React 官网出的脚手架工具 create-react-app,能够一键创立一个 Web 应用程序:

cmd> npm install -g create-react-app
cmd> cd E:
cmd> create-react-app react-todoapp
cmd> cd react-todoapp 

脚手架会在当前目录创立一个 react-todoapp 目录:

react-todoapp
├── README.md
├── node_modules
├── package.json
├── package-lock.json
├── .gitignore
├── public
│   ├── favicon.ico
│   ├── index.html
│   └── manifest.json
└── src
    ├── App.css
    ├── App.js
    ├── App.test.js
    ├── index.css
    ├── index.js
    ├── logo.svg
    └── serviceWorker.js
    └── setupTests.js 

目录中次要的文件和文件夹阐明:

  • README.md: 我的项目简介,反对 Markdown 语法
  • node_modules: 我的项目的依赖包,相似 Maven Repository
  • package.json: 配置我的项目依赖的第三方包,相似 pom.xml
  • package-lock.json: 锁定第三方包的版本号,保障 npm install 版本统一
  • public: 公开资源,网站门路,相似 nginx 的 html 目录
  • src: 外围组件代码文件

为了便于开发,删除目录中不必要的文件,最终构造如下:

react-todoapp
├── README.md
├── node_modules
├── package.json
├── package-lock.json
├── .gitignore
├── public
│   └── index.html
└── src
    ├── App.css
    ├── index.js
    ├── TodoApp.js
    ├── TodoItem.js
    └── TodoList.js 

接下来,设计与实现一个 TodoList 的例子,咱们把所有代码过一下,敲一遍,先不论为什么,跑起来,最初再整顿下知识点。

  1. 实例 TodoApp

次要实现性能有:

  • 增加一个待办事项
  • 删除一个待办事项
  • 勾选复选框标记事项已实现

如图所示,总共将页面拆分成了三个组件:TodoApp, TodoListTodoItem

3.1 index.js 入口文件

应该能够类比 java 的 main 办法,在 src 目录新建 index.js 内容如下:

// 引入 React, ReactDOM
import React from 'react';
import ReactDOM from 'react-dom';
// 引入 TodoApp 组件
import TodoApp from './TodoApp';

// 将渲染后果挂在到 root 节点,该节点在 index.html 中
ReactDOM.render(
    <React.StrictMode>
        <TodoApp />
    </React.StrictMode>,
    document.getElementById('root')
); 

先导入须要应用的组件(类),而后调用它们提供的办法和服务,有没有些许眼生?

3.2 TodoApp.js

TodoApp 设计了页面整体布局,它蕴含全副数据以及操作这些数据的办法,是其余两个组件的 父组件

import React, {Component} from 'react';
import TodoList from './TodoList';
import './app.css';

class TodoApp extends Component {constructor(props) { // 构造方法,props 应该是父类的一个成员变量
        super(props);
        this.state = { // 组件状态数据
            text: '',
            items:[{id: 1, status: 1, text: "去月球"},{id: 2, status: 0, text: "去火星"}]
        };

        // 设置 this 指向,默认 undefined
        this.handleChange   = this.handleChange.bind(this);
        this.handleAdd      = this.handleAdd.bind(this);
        this.handleComplete = this.handleComplete.bind(this);
        this.handleDelete   = this.handleDelete.bind(this);
    }
    // 渲染解析 jsx
    render() {
        return (
            <div className="todo">
                <h3 className="text-center">Todos App</h3>
                <TodoList 
                    items={this.state.items} 
                    handleComplete={this.handleComplete} 
                    handleDelete={this.handleDelete} />

                <input className="input" type="text" placeholder="增加新工作" 
                    value={this.state.text} 
                    onChange={this.handleChange} />

                <button className="btn-add" onClick={this.handleAdd}> 增加 </button>
            </div>
        );
    }

    handleChange(e) {this.setState({ text: e.target.value})
    }

    handleAdd(e) {e.preventDefault();
        if (this.state.text.length === 0) {return;}

        const newItem = {id: Date.now(),
            text: this.state.text,
            status: 0
        };

        this.setState({items: [...this.state.items, newItem],
            text: ''
        });
    }

    handleComplete(taskid) {
        // 长期变量,不间接批改原数据
        let items = this.state.items;
        let findItem = items.find(item => item.id === taskid);
        findItem.status = findItem.status === 0 ? 1 : 0;

        this.setState({items: items});
    }
    
    handleDelete(taskid) {
        let items = this.state.items;
        items = items.filter(item => item.id !== taskid);
        this.setState({items: items});
    }
}

正文完
 0