React ToDolist增加功能

简介: React ToDolist增加功能

补充知识点


1==》


npm install prop-types 先安装参数校验包


在B C页面引入


import PropTypes from 'prop-types' //参数限制
    // 验证 参数必要性  B页面
    static propTypes = {
        len: PropTypes.number.isRequired,
        addtod: PropTypes.func.isRequired
    }
// 验证 参数必要性C页面
 static propTypes = { todolist: PropTypes.array.isRequired } 


1425695-20191003003757347-1957053355.png


关于todelist的总结


1==》将数据放在父组件中


 constructor(props){
          super(props);
          this.state={
              todolist:[
                  { id: 1, text: "web111" },
                  { id: 2, text: "web222" },
                  { id: 3, text: "web333" }
              ]
          }
    }


2==》将父组件中的数据  传递给子组件(父传子)


let { todolist}=this.state; //结构
 <C todolist={todolist}></C>


3==》子组件进行渲染


render() {
        let { todolist } = this.props; 
        console.log("值传递过来",todolist)
        return (
         <ul>
               {todolist.map((item,index)=>{
                 return  <li key={index}>{item.text}</li>
               })}
         </ul>
        )
    }


4==》将父组件的长度  传递给子组件


<B len={todolist.length} addtod={this.addtod}></B>  父


5==》 子组件进行渲染


render() {
        let { len}=this.props
        return (
            <div>
                <input type="text" ref="conn" /><button onClick={this.add} >123#{len}</button>
            </div>
        )
    }


6==》点击按钮获取到值


 render() {
        let { len}=this.props
        return (
            <div>
                <input type="text" ref="conn" /><button onClick={this.add} >123#{len}</button>
            </div>
        )
    }
    add=()=>{
        console.log(this.refs.conn.value) 
        let uservalu = this.refs.conn.value; //获取值
        let {addtod}=this.props;//父组件想子组件传递了一个方法
        addtod(uservalu)  //调用这个方法
        this.refs.conn.value=""; //清空
    }


7==》父组件给子组件传递方法


8==》子组件调用父组件的方法 并且返回表单中的内容


9==》父组件接受子组件中返回来的数据  更改state


1425695-20191003003852813-585739378.png


以下是完整代码


A.js  标题


import React, { Component } from "react"
export default class A extends Component {
    render() {
        return (
            <div>我是标题  todo list</div>
        )
    }
}


B.js 表单和按钮


import React, { Component } from "react"
export default class B extends Component {
    add=()=>{
        console.log(this.refs.conn.value) 
        let uservalu = this.refs.conn.value; //获取值
        let {addtod}=this.props;//父组件想子组件传递了一个方法
        addtod(uservalu)  //调用这个方法
        this.refs.conn.value=""; //清空
    }
    render() {
        let { len}=this.props
        return (
            <div>
                <input type="text" ref="conn" /><button onClick={this.add} >123#{len}</button>
            </div>
        )
    }
}


C.js 渲染


import React, { Component } from "react"
export default class C extends Component {
//    constructor(props){
//        super(props);
//        let { todolist}=this.props; 
//    }
    render() {
        let { todolist } = this.props; //它等价于上面的哪一个内容
        console.log("值传递过来",todolist)
        return (
         <ul>
               {todolist.map((item,index)=>{
                 return  <li key={index}>{item.text}</li>
               })}
         </ul>
        )
    }
}


最大父组件DoAddList.js


import React, { Component } from "react"
// 引入组件
import A from "./A"
import B from "./B"
import C from "./C"
export default class DoAddList extends Component {
    constructor(props){
          super(props);
          this.state={
              todolist:[
                  { id: 1, text: "web111" },
                  { id: 2, text: "web222" },
                  { id: 3, text: "web333" }
              ]
          }
    }
    addtod=(data)=>{
        let con=this.state.todolist;
        con.unshift({ id: this.state.todolist.length + 1, text: data })
        // 跟新状态
        this.setState({
            todolist: con
        })
    }
    render() {
        let { todolist}=this.state; //结构
        return (
            <div>
              <A></A>
                {/* 将右边的{this.addtod 方法传递给子组件 */}
                <B len={todolist.length} addtod={this.addtod}></B>
                {/*将父组件中的数据  传递给子组件(父传子)*/}
                <C todolist={todolist}></C>
            </div>
        )
    }
}
相关文章
|
前端开发
React查询、搜索类功能的实现
React查询、搜索类功能的实现
139 0
|
存储 前端开发 JavaScript
最适合新手学习的react案例-Todolist尊享版!
【8月更文挑战第13天】最适合新手学习的react案例-Todolist尊享版!
209 2
最适合新手学习的react案例-Todolist尊享版!
|
移动开发 前端开发 JavaScript
React DnD:实现拖拽功能的终极方案?
本文首发于微信公众号“前端徐徐”,介绍了一个强大的 React 拖拽库——React DnD。React DnD 帮助开发者轻松创建复杂的拖拽界面,适用于 Trello 风格的应用、列表重排序、可拖拽的 UI 组件等场景。文章详细介绍了 React DnD 的基本信息、主要特点、使用场景及快速上手指南。
1174 3
React DnD:实现拖拽功能的终极方案?
|
移动开发 前端开发
react项目配合diff实现文件对比差异功能
在React项目中,可以使用`diff`库实现文件内容对比差异功能。首先安装`diff`库,然后在组件中引入并使用`Diff.diffChars`或`Diff.diffLines`方法比较文本差异。通过循环遍历`diff`结果,可以生成不同样式的HTML元素来高亮显示文本差异。
629 1
react项目配合diff实现文件对比差异功能
|
前端开发
React 中购物车功能实现(全选多选功能实现)
React 中购物车功能实现(全选多选功能实现)
122 2
|
前端开发
|
存储 JavaScript 前端开发
探索React状态管理:Redux的严格与功能、MobX的简洁与直观、Context API的原生与易用——详细对比及应用案例分析
【8月更文挑战第31天】在React开发中,状态管理对于构建大型应用至关重要。本文将探讨三种主流状态管理方案:Redux、MobX和Context API。Redux采用单一存储模型,提供预测性状态更新;MobX利用装饰器语法,使状态修改更直观;Context API则允许跨组件状态共享,无需第三方库。每种方案各具特色,适用于不同场景,选择合适的工具能让React应用更加高效有序。
287 0
|
存储 移动开发 前端开发
初探react,用react实现一个todoList功能
该文章通过创建一个TodoList应用来介绍React的基础知识,包括环境搭建、组件创建、状态管理和事件处理,并演示了如何使用React Hooks来优化组件逻辑。
|
JavaScript 前端开发
在React和Vue中实现锚点定位功能
在React和Vue中实现锚点定位功能
345 1
|
存储 前端开发 JavaScript
【亮剑】在React中,处理`onScroll`事件可实现复杂功能如无限滚动和视差效果
【4月更文挑战第30天】在React中,处理`onScroll`事件可实现复杂功能如无限滚动和视差效果。类组件和函数组件都能使用`onScroll`,通过`componentDidMount`和`componentWillUnmount`或`useEffect`添加和移除事件监听器。性能优化需注意节流、防抖、虚拟滚动、避免同步计算和及时移除监听器。实战案例展示了如何用Intersection Observer和`onScroll`实现无限滚动列表,当最后一项进入视口时加载更多内容。合理利用滚动事件能提升用户体验,同时要注意性能优化。
756 0