第二章 React基础

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中绑定事件有两点:


第二章 React基础_第1张图片

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

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

render(){
    return()
}

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

render(){
    return()
}
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()
}

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

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

使用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(
        
    {this.state.list.map( (item)=>( //bind除了绑定this,还绑定item作为参数。提供handleClick使用 {
  • {item}
  • } ) )}
) }

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

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

你可能感兴趣的:(第二章 React基础)