zoukankan      html  css  js  c++  java
  • react入门(五):事件处理、条件渲染、列表&keys、表单

    一、事件处理

    React事件绑定属性的命名采用驼峰式写法,而不是小写。

    直接看代码

    两种方式绑定事件并传参数
    
    第一种:
    
    constructor(props) {
        super(props);
        //在dom上用bind函数绑定了this,这里可以省略
        this.handleClick = this.handleClick.bind(this);
    }
    
    handleClick(value, e) {
        //e要写在value后面
        console.log(value);     //2020/1/13 下午7:09:35
        console.log(e.target);  //<button>handle</button>
    }
    
    <button onClick={(e) => {this.handleClick.bind(this,this.state.time)}}>handle</button>
    
    
    第二种(更倾向于第二种)
    
     handleClick = (value, e)=> {
        console.log(value);     //2020/1/13 下午7:09:35
        console.log(e.target);  //<button>handle</button>
    }
    
    <button onClick={(e) => {this.handleClick(this.state.time, e)}}>handle</button>

    二、条件渲染

    直接看代码

    render() {
        let button = null;
        //1.可以根据变量的不同选择不同的渲染
        if (this.props.flag) {
            button = <button>show</button>
        } else {
            button =  <button>hide</button>
        }
        return (
            <div>
                {button}
                //2.可以在jsx中直接判断
                {this.state.num > 0 && button}
            </div>
        )
    }

    三、列表与keys

    直接看代码

    render() {
        //1.先定义变量获取渲染元素,然后进行渲染
        const numbers = [1, 2, 3, 4, 5];
        const listItems = numbers.map((number) =>
            <li key={number.toString()}>{number}</li>
        );
        return (
            <div>{listItems}</div>
        )
        
        //2.直接在jsx中处理
        return (
            <div>{numbers.map((number) => <li key={number.toString()}>{number}</li>)}</div>
        )
    }

    关于keys

    Keys可以在DOM中的某些元素被增加或删除的时候帮助React识别哪些元素发生了变化。当子节点有key时,React使用key来匹配原本树的子节点和新树的子节点。因此你应当给数组中的每一个元素赋予。

    万不得已,你可以传递他们在数组中的索引作为key。若元素没有重排,该方法效果不错,但重排会使得其变慢。当索引用作key时,组件状态在重新排序时也会有问题。

    组件实例基于key进行更新和重用。如果key是索引,则item的顺序变化会改变key值。这将导致非受控组件的状态可能会以意想不到的方式混淆和更新。

    Keys应该是稳定的,可预测的,且唯一的。不稳定的key(类似由Math.random()生成的)将使得大量组件实例和DOM节点进行不必要的重建,使得性能下降并丢失子组件的状态。

    四、表单

    直接看代码

    //1.使用受控组件实现表单(利用state的改变)
    export default class Form extends React.Component{
        constructor () {
            super();
            this.state = {
                name: 'zs',
                age: 23
            }
        }
        handle = (e)=> {
            let name = e.target.name;
            //根据不同的控件名称来修改不同控件的值
            this.setState({
                [name]: e.target.value
            })
        }
        render() {
           return (
               <div>
                   <input name={'name'} value={this.state.name} onChange={(e)=>{this.handle(e)}}/>{this.state.name}
                   <input name={'age'} value={this.state.age} onChange={(e)=>{this.handle(e)}}/>{this.state.age}
               </div>
           )
        }
    }
    
    <input>, <textarea>和 <select> 都十分类似 - 他们都通过给value传入一个属性加上事件操作来实现对组件的控制。
    
    
    //2.使用非受控组件实现表单(从ref中获取dom的值)
    export default class Form extends React.Component{
        constructor () {
            super();
            this.state = {
                name: 'zs',
                age: 23
            }
        }
        handle = (e)=> {
            let name = e.target.name;
            this.setState({
                [name]: this[name].value
            })
        }
        render() {
            return (
                <div>
                    <input name={'name'} defaultValue={this.state.name} ref={input => {this.name = input}} onChange={e => this.handle(e)}/>{this.state.name}
                    <input name={'age'} defaultValue={this.state.age} ref={input => {this.age = input}} onChange={e => this.handle(e)}/>{this.state.age}
                </div>
            )
        }
    }
  • 相关阅读:
    Yocto开发笔记之《驱动调试-华为3G模块》(QQ交流群:519230208)
    Yocto开发笔记之《应用程序架构》(QQ交流群:519230208)
    Yocto开发笔记之《串口驱动调试》(QQ交流群:519230208)
    Yocto开发笔记之《快速入门,环境搭建 & 编译》(QQ交流群:519230208)
    Linux Canbus调试笔记
    ubuntu默认防火墙
    Linux安全之——Ubuntu的iptable命令使用
    嵌入式Linux系统开发环境搭建
    在Android上实现使用Facebook登录(基于Facebook SDK 3.5)
    Android应用内语言切换实现(转)
  • 原文地址:https://www.cnblogs.com/chaixiaozhi/p/12190943.html
Copyright © 2011-2022 走看看