简单理解React组件

两种组件:函数组件和类组件

//函数组件
function min() {
    return(
        <div className="App">
            爸爸
            <Son /> 自闭标签直接使用即可
        </div>
    )
}

//类组件
class Son extends React.Component{
    constructor(){
        super();
        this.state={
            n:0
        };
    }
    add(){
        this.setState({n: this.state.n+1})
    }
    render(){
        return(
            <div className="Son">
                儿子 n: {this.state.n}
                <button onClick={()=>this.add()}>+1</button>
                <GrandSon />
            </div>
        )
    }
}

//函数组件
const GrandSon = ()=> {
    //这是析构赋值
    const [n,setN] = React.useState(0);
    return(
        <div className="GrandSon">
            孙子 n: {n}
            <button onClick={()=>setN(n+1)}>+1</button>
        </div>
    )
}

React语法糖-标签

当我们在写<Son />的时候我们在写什么?首先排除HTML,我们不是在写HTML,

<Son />会被翻译成 React.createElement(App)

React.createElement的逻辑

如果传入一个字符串'div',则会创建一个div

如果传入一个函数,则会创建一个函数并调用其返回值

如果传入一个类,则在类前面加一个new(这会导致执行constructor),获取一个组件对象,然后调用对象的render方法,获取其返回值

Props

给类组件传递

// 这是一个子组件 子组件使用类构成的
<Son msg="传递数据"/>

传递的数据可以是任何东西,如果是字符串,就使用双引号,如果传递的是值就使用花括号。

class Son extends React.Component{
  render(){
    return(
      {this.props.msg}
    )
  }
}

// 如上,在花括号中使用,this.props.msg接受数据

给函数组件传递

传递方法不变,接受方法如下

const GrandSon = (props)=>{
  {props.msg}
}

箭头函数括号中可以写任何声明名,但通常我们写成props,在花括号中使用props.msg即可

 

State

state相当于Vue中的data,在React中如何初始化&读&写

在类中 初始化&读&写// 初始化 

 //初始化

constructor(){ super()
this.state = { n:0 } } // 在类中声明 this.state={} // 然后填入数据 // 读取 {this.state.n} // 使用 this.state.n方法 // 修改 使用 setState this.setState({n:this.state.n+1}) //无bug写法
//因为React没有监听数据,所以必须开辟一个新的数据空间,让他们互相对比,让React修改数据
this.setState(state=>{ const n = state.n + 1 return {n} })

如果使用vue,我们修改的data数据只需要 this.state.n+1 ,而react需要这么写是因为他并没有监听任何数据,我们需要告知react我们修改了n的数据

 

在函数中 初始化&读&写

// 初始化
//setxxx 就是一种React修改数据的方法
const [x,setX] = React.useState(0)

// 读取 

{x}

// 使用 

onClick={()=>{setX(x+1)}

类组件注意事项

this.state.n +=1 失效?

例如我们直接更改n,UI不会更新,因为React没有监听n,我们可以调用setState触发UI更新

setState会异步更新UI

setState后,state不会马上改变,现在更推荐使用setState函数

复杂state

如果我们有两个state数据怎么办?不用怕,state会帮我们自动合并第一层数据,合并了第一层,我们如果有两层数据怎么办?只需要在函数中加入 ...state 即可

事件绑定

类组件的事件绑定

onClick={ ()=>{ ... } } (推荐写法)

  • 安全,易懂

onClick={this.....} 

  • this容易变成window

onClick={this.addN.bind(this)} 

  • 绑定this,太麻烦

类组件的事件绑定最终写法

class Son extends React.Component{

//这两种写法对等
addN
= () => this.setState({n: this.state.n + 1});
===
constructor(){ this.addN = ()=> this.setState({n: this.state.n + 1}) }
render(){
return <button onClick={this.addN}>n+1</button> } }

 

 

 

posted @ 2021-03-10 01:20  蛰鸣  阅读(17)  评论(0编辑  收藏  举报