React 入门 做一个简单todolist

React 入门笔记 做一个简单todolist

第一步,看文档,不多说

安装react

环境准备:

  • 安装node ,去官网下载安装,安装完自带npm包管理工具

根据官网教程,create react app

npx create-react-app my-app
cd my-app
npm start // or yarn start

npx 是一个帮你执行文件的工具

npx 会自动查找当前依赖包中的可执行文件,如果找不到,就会去 PATH 里找。如果依然找不到,就会帮你安装!

精简代码

打卡src目录,只保留index.js app.js 文件内的其他依赖都删掉,只保留 React ReactDOM 相关的代码

index.js 是入口文件,修改后index.js 文件如下:

import React from 'react';
import ReactDOM from 'react-dom';
import TodoList from './TodoList';

ReactDOM.render(<TodoList />, document.getElementById('root'));

原本的组件名<App />改为了<TodoList />

修改app.js重命名为TodoList.js把原来的内容改为如下:

import React, { Component } from 'react'

class TodoList extends Component {
    render() {
        return (
        	<div>hello react</div>
        )
    }
}
export default TodoList

页面也可以正常运行,并在页面上显示出hello react

下面进行代码修改

用jsx语法写页面结构代码,代码经过优化

知识点:

  • js的this绑定,写在dom上的方法this会指向dom元素,需要用bind绑定this到class
  • es6语法,扩展运算符,解构赋值,对象属性简写
  • 父组件通过参数的形式向子组件传递参数
  • 子组件通过props接收父组件传递过来的参数
  • 父子组件通信,子组件通过父组件传递过来的方法,触发父组件上绑定的方法,达到通信的目的

TodoList.js

import React, { Component, Fragment } from 'react'
import TodoItem from './TodoItem'
import './style.css'

class TodoList extends Component {
  constructor(props) {
    super(props)
    this.state = {
      list: [],
      inputValue: ''
    }

    this.handleInputChange = this.handleInputChange.bind(this)
    this.handleBtnClick = this.handleBtnClick.bind(this)
    this.handleDelete = this.handleDelete.bind(this)
  }

  handleInputChange(e) {
    this.setState({
      inputValue: e.target.value
    })
  }

  handleBtnClick() {
    this.setState({
      list: [...this.state.list, this.state.inputValue],
      inputValue: ''
    })
  }

  handleItemClick(index) {
    console.log(index)
    const list = [...this.state.list]
    list.splice(index, 1)
    this.setState({
      list
    })
  }

  // 父组件通过属性的形式向子组件传递参数
  // 子组件通过props接收父组件传递过来的参数
  handleDelete(index) {
    console.log(index)
    const list = [...this.state.list]
    list.splice(index, 1)
    this.setState({
      list
    })
  }

  getTodoItem() {
    return this.state.list.map((item, index) => {
      return (
        <TodoItem
          deleteItem={this.handleDelete}
          key={index}
          content={item}
          index={index}
        />
      )
    })
  }
  render() {
    return (
      // Fragment 只作包裹作用,不会产生一个div
      <Fragment>
        <input
          value={this.state.inputValue}
          onChange={this.handleInputChange}
        />
        <button className="red-btn" onClick={this.handleBtnClick}>add</button>
        <ul>{this.getTodoItem()}</ul>
      </Fragment>
    )
  }
}

export default TodoList

src目录下新建一个TodoItem.js

import React from 'react'

class TodoItem extends React.Component {
  constructor(props) {
    super(props)

    this.handleDelete = this.handleDelete.bind(this)
  }
  // 子组件如果想和父组件通信,子组件要调用父组件传递过来的方法
  handleDelete() {
    // console.log(this.props.index)
    // this.props.delete(this.props.index) //代码优化
    const {deleteItem, index} = this.props
    deleteItem(index)
  }
  render() {
    const {content} = this.props
    return (<div onClick={this.handleDelete}>{content}</div>)
  }
}
export default TodoItem

完整代码demo: https://gitee.com/hotsuitor/react_demo.git

用过vue开发过项目,入门react,觉得react写起来真的爽

好的,下面是一个使用React和TypeScript完成TodoList示例: 首先,创建一个React组件:TodoList.tsx ```tsx import React, { useState } from "react"; interface TodoItem { id: number; content: string; completed: boolean; } const TodoList = () => { const [todos, setTodos] = useState<TodoItem[]>([]); const [inputValue, setInputValue] = useState(""); const handleAddTodo = () => { if (inputValue.trim() === "") return; const newTodo: TodoItem = { id: todos.length, content: inputValue, completed: false }; setTodos([...todos, newTodo]); setInputValue(""); }; const handleToggleTodo = (id: number) => { const updatedTodos = todos.map(todo => todo.id === id ? { ...todo, completed: !todo.completed } : todo ); setTodos(updatedTodos); }; const handleDeleteTodo = (id: number) => { const updatedTodos = todos.filter(todo => todo.id !== id); setTodos(updatedTodos); }; return ( <div> <h1>Todo List</h1> <div> <input type="text" value={inputValue} onChange={e => setInputValue(e.target.value)} /> <button onClick={handleAddTodo}>Add</button> </div> <ul> {todos.map(todo => ( <li key={todo.id} style={{ textDecoration: todo.completed ? "line-through" : "none" }} > {todo.content} <button onClick={() => handleToggleTodo(todo.id)}> {todo.completed ? "Uncomplete" : "Complete"} </button> <button onClick={() => handleDeleteTodo(todo.id)}>Delete</button> </li> ))} </ul> </div> ); }; export default TodoList; ``` 在这个组件中,我们定义了一个状态todos来存储所有的待办事项,以及一个状态inputValue来存储用户输入的新待办事项的内容。我们通过useState Hook来定义这些状态。 我们还定义了三个处理函数handleAddTodo、handleToggleTodo和handleDeleteTodo来添加、切换完成状态和删除待办事项。我们通过map函数来遍历todos数组,以便将每个待办事项渲染为一个li元素。 最后,我们导出TodoList组件。 接下来,在App.tsx中使用TodoList组件: ```tsx import React from "react"; import TodoList from "./TodoList"; const App = () => { return ( <div> <TodoList /> </div> ); }; export default App; ``` 现在,我们就可以在浏览器中查看TodoList应用程序了。 注:在使用前需要先安装React和TypeScript的依赖。在终端中执行以下命令: ```sh npm install react react-dom npm install --save-dev typescript @types/react @types/react-dom ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值