美文网首页
第二章 React基础

第二章 React基础

作者: 留白_汉服vs插画 | 来源:发表于2019-01-14 15:41 被阅读43次

    2.1 JSX基本语法

    1、基本语法:成对的标签构成一个树状结构的数据。
    2、标签类型:小写字母表示DOM类型标签,大写的表示React类型标签。
    3、JavaScript表达式:jsx中使用JavaScript表达式,用大括号括起来,表达式在jsx中使用的场景主要有两个:通过表达式给组件赋值,通过表达式定义子组件。
    JSX只能使用JavaScript表达式,不能使用多行的JavaScript语句、但是可以使用三目运算符或逻辑与&&代替if
    4、DOM标签支持的属性,JSX也都支持,只不过,部分属性会有调整,class变成className,时间都成了驼峰,onclick变成了onClick、自定义的React组件,可以任意自定义标签属性名。
    5、{/* */} 注释

    2.2 组件

    2.5 事件处理

    React中绑定事件有两点:



    注意:DOM事件 ie的是这么个 但是标准浏览器 还是调用e..preventDetault()

    React中最容易错的是时间处理函数中的this指向问题,因为ES6 class并不会为方法自动绑定this到当前对象。
    this指向问题:
    1、使用箭头函数

    render(){
        return(<button onClick={(event)=>{console.log(this.state.number);}}>按钮</button>)
    }
    

    但是如果事件逻辑复杂,这么写就很臃肿了。把逻辑封装成一个方法,然后在箭头函数中调用这个方法

    render(){
        return(<button onClick={(event)=>{this.handleClick(event)}>按钮</button>)
    }
    handleClick(event){
        //这里定义函数体
    }
    

    直接在render方法中为元素事件定义事件处理函数,最大的问题是,每次render调用,都会重新创建一个新的时间事件处理函数。

    2、使用组件的方法
    直接将组件的方法赋值给元素的事件属性,同时在类的构造函数中,将这个方法的this绑定到当前对象、

    class MyComponent extends React.Component{
        constructor(props){
            super(props);
            this.state = {number:0}
            this.handleClick = this.handClick.bind(this)
        }
    }
    handleClick(event){
        //这里定义函数体
    }
    render(){
        return(<button onClick={this.handleClick}>按钮</button>)
    }
    

    但是这么每次在构造函数里面写定义,很烦,于是就有下面这样写的:

    class MyComponent extends React.Component{
        constructor(props){
            super(props);
            this.state = {number:0}
        }
    }
    handleClick(event){
        //这里定义函数体
    }
    render(){
        return(<button onClick={this.handleClick.bind(this)}>按钮</button>)
    }
    

    使用bind会创建一个函数,因此每次render都会创建一个新函数。但是需要为处理函数传递额外参数时候,这种写法就有用武之地,比如需要为时间handleClick传入参数item

    class MyComponent extends React.Component{
        constructor(props){
            super(props);
            this.state = {
               List:[1,2,3,4],
               current:1
            }
        }
    }
    handleClick(event){
        this.setState({
            current:item
        })
    }
    render(){
        return(
            <ul>
                {this.state.list.map(
                        (item)=>(
                           //bind除了绑定this,还绑定item作为参数。提供handleClick使用
                           {<li className={this.state.current === item ? 'current' : ' '
                                        onClick = {this.handleClick.bind(this,item)}>{item}
                           </li>}
                )
                )}
            </ul>)
    }
    

    3.属性初始化语法
    ES7属性初始化自动为class中定义的方法绑定this、

    class MyComponent extends React.Component{
        constructor(props){
            super(props);
            this.state = {number:0}
        }
    }
    //这里是重点,实际上也是用了箭头函数
    handleClick=(event)=>{
        //这里定义函数体
    }
    render(){
        return(<button onClick={this.handleClick}>按钮</button>)
    }
    

    相关文章

      网友评论

          本文标题:第二章 React基础

          本文链接:https://www.haomeiwen.com/subject/pmqghqtx.html