首页 > 其他分享 >ReactDemo - todolist

ReactDemo - todolist

时间:2023-04-05 11:04:44浏览次数:52  
标签:const todolist state ReactDemo props todo id todos


(

ES6书籍推荐:ES6书籍

React中文:http://react-china.org/

React中文文档:https://react.docschina.org/

DevDocs - 开发文档网站:https://devdocs.io/

)

下面是webstorm打开看到的效果(自动建立的文件删了)

ReactDemo - todolist_todoList

public/index.html是一个入口,index.js是这个入口的js文件

components是使用到的组件

1.index.html不用变,默认渲染root就是了,

看index.js

import React  from 'react'
import ReactDOM from 'react-dom'

import App from './components/App'

//入口
ReactDOM.render(
  <App />,
  document.getElementById('root')
);

2.App.js

import React ,{Component} from 'react'

import Filter from "./Filter";
import List from "./List";

export default class  extends Component {

  constructor (props){
    super(props);

    // 初始化一些数据
    this.state = {
      todos: [
        {id:1 ,todo:'吃w饭'},
        {id:2 ,todo:'睡w觉'},
        {id:3 ,todo:'敲a代码'}
      ],

      // 文本框中的内容
      keyword:'',
      nextId:4
    }
  }

  // 添加todo
  addTodo =(todo)=>{
    // 先获取todos以及len,然后将新的todo添加到todos
    // 最后更新状态,不然看不到效果
    const {todos} = this.state;
    let {nextId} = this.state;
    todos.push({id:nextId,todo:todo});
    nextId += 1;//这里改变了值,下面的setState就要用花括号了,不然有报错,因为state必须是对象
    this.setState(todos);
    this.setState({nextId});
  };

  // 删除指定id的todo
  deleteTodo =(id)=>{
    let {todos} = this.state;
    todos = todos.filter( (item) => item.id!==id);
    this.setState({todos});
  };

  // 查找
  searchTodo=(keyword)=>{
    // state必须是一个对象
    this.setState({keyword});
  };

  render() {
    const {keyword} = this.state;
    const {todos} = this.state;
    let curTodos;

    // 判断是否需要查找
    if(keyword.length > 0){
      const {todos} = this.state;
      curTodos = todos.filter( item => item.todo.indexOf(keyword) > -1 );
    }else {
      curTodos = todos;
    }

    return (
      <div>
        {/* 文本输入框、添加按钮、查找按钮 */}
        <Filter addTodo={this.addTodo} searchTodo={this.searchTodo}/>
        {/* 显示列表 */}
        <List todos={curTodos} deleteTodo={this.deleteTodo}/>
      </div>
    );
  }
}

3.Filter.js

import React from 'react'
import PropTypes from 'prop-types'
//不能在'react'中导入PropTypes

export default class Filter extends React.Component {

  addTodo =()=>{
    const text = this.input.value.trim();

    //空串不让添加
    if(!text){
      return;
    }
    this.props.addTodo(text);
  };

  searchTodo =()=> {
    const text = this.input.value.trim();
    this.props.searchTodo(text);
  };

  render() {
    return (
      <div>
        {/*
          text1 => this.input3 = text2
          text1 = text2,input3就是this.input.value的input
        */}
        <input type='text' ref={text => this.input = text}/>  
        <button onClick={this.addTodo}>Add</button>  
        <button onClick={this.searchTodo}>Search</button>
      </div>
    );
  }
}

Filter.propTypes = {
  addTodo:PropTypes.func.isRequired,
  searchTodo:PropTypes.func.isRequired
};

4.List.js

import React ,{Component} from 'react'
import PropTypes from 'prop-types'

import Item from './Item'

export default class List extends Component {

  deleteTodo =(id)=>{
    // 调用父组件的deleteTodo
    this.props.deleteTodo(id);
  };

  render() {
    const {todos} = this.props;
    return (
      <div>
        <ul>
          {/*
            遍历todos,每一个todo传参给Item,让他来显示
            {todos.map((todo,key) => <li todo={todo} key={key} />)}
          */}
          { todos.map((todo, key) => <Item key={key} todo={todo} deleteTodo={this.deleteTodo} />) }
        </ul>
      </div>
    );
  }
}
List.propTypes = {
  todos:PropTypes.array.isRequired,
  deleteTodo:PropTypes.func.isRequired
};

5.Item.js

import React ,{Component} from 'react'

export default class Item extends Component {

  deleteTodo =()=>{
    const {todo} = this.props;
    this.props.deleteTodo(todo.id);
  };

  render() {
    const {todo} = this.props;
    //console.log(todo);//ok
    return (
      <div>
        {/*{todo.id},{todo.todo}*/}
        <li>{todo.id}:{todo.todo} <button onClick={this.deleteTodo}>×</button> </li>
      </div>
    );
  }
}

OK

执行一下:npm start

打包:npm run build

打包之后访问网页是空的,因为还需要服务器

ReactDemo - todolist_todoList_02

执行上面的两行代码就欧克了

npm install -g serve
serve -s build

后端啥都要懂hhh

标签:const,todolist,state,ReactDemo,props,todo,id,todos
From: https://blog.51cto.com/u_15741949/6170280

相关文章

  • Vue.js TodoList案例-编辑& $nextTick
    编辑部分功能视频$nextTick视频本节遗留问题,点击input框才有焦点,写逻辑的时候是绑定在blur上面的。如果不点击input再点击其他地方,不能触发input框转换到文字的逻辑。......
  • Vue.js TodoList案例pubsub
    视频MyItem.vueApp.vue修改componentsMyFooter.vue<template> <divclass="todo-footer"v-show="total"> <label> <!--<inputtype="checkbox":checked="i......
  • golang_gin_learn_todolist
    /Users/song/codelearn/golang/bubble-master/go.modmodulebubblego1.13require( github.com/0xAX/notificatorv0.0.0-20220220101646-ee9b8921e557//indirect......
  • day80-todolist组件自定义事件改进
    todolist-自定义组件通过自定义组件改进todolist案例,不全使用prop方式header组件<template><divclass="todo-header"><inputtype="text"placeholder="请输......
  • day77-todolist案例
    todolist案例总和设计一个添加删除框,添加代办的事项,外加一个勾选框可以一键删除所有已完成的事项初期设计首先设计静态功能:分为头部中间尾部三部分头部一个添......
  • MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(3)-系统数据集合设计
    前言前几章教程我们把ToDoList系统的基本框架搭建好了,现在我们需要根据我们的需求把ToDoList系统所需要的系统集合(相当于关系型数据库中的数据库表)。接下来我们先简单......
  • jquery-todolist删除数据1-66
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>todoList......
  • jquery-todolist本地存储加载到页面
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>todoList......
  • React练习实例-TodoList
    目标顶部输入框中输入任务(字符串),敲击回车键后,中间新出现一个代办项鼠标放在单个代办项,右侧出现删除按钮,点击删除代办项选中多个代办项,点击右下角“清除已完成”按钮,删......
  • vue项目todolist
    初始化项目(1)先把vue项目创建出来(2)然后把src中的文件替换掉,替换成我们项目的文件(3)创建3个组件,头部组件(TodoHeader),身体组件(TodoMain),结尾组件(TodoFooter)(4)把样式导入App.vu......