React 学习第二天

101 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

React组件基础

  • 组件的特点:可复用、独立、可组合

1.组件的两种创建方式

  • 使用函数创建组件:使用JS的函数(箭头函数)创建组件

    // 约定1:函数名称必须以大写字母开头
    // 约定2:函数必须有返回值,表示该组件的结构
    // 返回null 表示不渲染内容
    function Hello(){
        return (
        <div>这是一个函数组件.</div>
        )
    }
    
    // 箭头函数
    const Hello = () => (<div>这是一个箭头函数组件.</div>)
    
  • 使用类创建组件

    类组件:使用ES6的class创建组件

    /*
    	1. 类名称必须以大写字母开头
    	2. 类组件应该继承React.Componet父类,从而可以使用父类中提供的方法或属性
    	3. 类组件必须提供render()方法
    	4. render()方法中必须有返回值,表示该组件的结构
    */
    class Hello extend React.Componet{
        render(){
            return <div>这是一个类创建的组件</div>
        }
    }
    
    ReactDOM.render(<Hello />, root)
    

2.事件处理

  • 事件绑定

    语法:on+事件名称={事件处理程序},如:onClick={()=> { ...}}

    class App extends React.Component {
        handleClick() {
            console.log('单击事件触发了')
        }
        
        render(){
            return (
            	<button onClick={this.handleClick}>点击触发事件</button>
            )
        }
    }
    
  • 事件对象

    可以通过事件处理程序的参数获取到事件对象

    function handleClick(e){
        e.preventDefault()
        
        console.log('触发单击事件')
    }
    

3.有状态组件和无状态组件

  • 函数组件又叫做无状态组件,类组件又叫做有状态组件
  • 状态即数据
  • 函数组件没有自己的状态,只负责数据展示
  • 类组件有自己的状态,负责更新UI

4.组件中的state和setState()

  • state的基本使用

    state的值是个对象,表示一个组件中可以有多个数据

    class App extends React.Component{
        constructor(){
            super()
            
            //初始化state
            this.state = {
                count: 0
            }
        }
        render(){
            return (
            	<div>
                	有状态组件:{this.state.count}
                </div>
            )
        }
    }
    
  • setState()修改状态

    语法:this.setState({})

  • 从JSX中抽离事件处理程序

    JSX中掺杂过多js逻辑代码,会显得非常混乱

    将逻辑抽离出单独的方法中

5.事件绑定this指向

  • 箭头函数

    箭头函数自身不绑定this,可以直接使用this指向组件实例

  • Function.prototype.bind()

    利用ES5中的bind()方法,将事件处理程序中的this与组件实例进行绑定

    class Hello extends React.Component{
        constructor(){
            super()
            this.onIncrement = this.onIncrement.bind(this)
        }
        state = {
            count = 0
        }
        onIncrement(){
            this.setState({count: this.state.count + 1})
        }
        render(){
            return (
            	<button onClick={this.onIncrement}></button>
            )
        }
    }
    
  • class的实例方法

    利用箭头函数形式的class实例方法

    class Hello extends React.Component{
        onIncrement = () => {
            this.setState({count: this.state.count + 1})
        }
        render(){
            return (
            	<button onClick={this.onIncrement}></button>
            )
        }
    }
    

6.表单处理

  • 受控组件

    HTML中的表单元素是可输入的,也就是有自己的可变状态

    React中可变状态通常保存在state中,并且只能通过setState()方法来修改

    /*
    步骤:
    1. 在state中添加一个状态,作为表单元素的value值(控制表单元素的来源)
    2. 给表单元素绑定change事件,将表单元素的值赋给state
    */
    
    state = {txt :''}
    
    <input type="text" value={this.state.txt}
        onChange={e=>this.setState({txt: e.target.value})}
    />
    
  • 非受控组件(DOM方式)

    /*
    步骤:
    1. 调用React.createRef()方法创建一个ref对象
    2. 创建好的ref对象添加到文本框中
    3. 通过ref对象获取文本框的值
    */
    
    constructor(){
        super()
        this.txtRef = React.createRef()
    }
    
    <input type="text" ref={this.txtRef} />
    
    Console.log(this.txtRef.current.value)