React基础_2(组件.事件.state.受控非受控)

本文介绍了React的基础知识,包括组件创建、事件绑定、状态(state)的使用,以及受控组件和非受控组件的概念。在组件创建中,提倡将组件抽离成独立的JS文件。事件绑定时,讲解了如何在函数组件和类组件中处理事件。关于状态管理,强调了通过`this.setState()`来更新状态,并提供了两种处理`this`指向的方法。此外,讨论了受控组件和非受控组件的区别,建议在实际应用中根据需求简化事件处理。
摘要由CSDN通过智能技术生成

前言

本篇内容主要包含以下内容
1.组件的创建
2.组件的事件绑定
3.state的使用
4.受控组件和非受控组件

正文

React最关键的内容就是组件,组件就是页面中一个个的元素,也可以说是一个个标签,共同组成整个页面.
创建一个组件:

function Hello(){
	return (
		<h2>我是一个函数组件</h2>)
	}
ReactDOM.render(<Hello />,document.getElementById('root'))
//函数组件的两个约定:
//1.开头必须是大写字母
//2.必须要有返回值,返回值就是这个组件的结构

在这里插入图片描述

//使用类创建组件
class Hello extends React.Component{
	render(){
		return (<h2>我是一个类组件</h2>)
		}
	}
ReactDOM.render(<Hello />,document.getElementById('root'))
/*
类组件的四个约定:
1.开头必须是大写
2.必须继承自React.Component
3.必须有render()方法
4.render()方法必须有返回值
*/

在这里插入图片描述
将组件抽离为独立的js文件,在使用时导入即可.

import React from "react";
import { render } from "react-dom";
class Hello extends React.Component{
    render(){
        return(
            <div>Hello JSX!!</div>
        )
    }
}

export default Hello;//设置默认导出;
//导入渲染即可
import Hello from './Hello';
ReactDOM.render(<Hello />,document.getElementById('root'))

在这里插入图片描述
React中的事件绑定:

//类组件,值得注意的是引用函数时要用this.函数名引用,函数前不需要加function;
class App extends React.Component{
    handClick(){
        console.log("事件触发")
    }
    render(){
        return (
            <div>
                <button onClick={this.handClick}>点击我</button>
            </div>
        )
    }
}

ReactDOM.render(<App />,document.getElementById('root'))

在这里插入图片描述
在这里插入图片描述

function App(){
    function handClick(){
        console.log("事件触发了")
    }

    return (
        <button onClick={handClick}>单击触发事件</button>
    )
}

ReactDOM.render(<App />,document.getElementById('root'))

在这里插入图片描述
在这里插入图片描述
//事件对象
函数组件又称无状态组件,类组件又叫做有状态组件。函数组件没有自己的状态,只负责展示静态的数据,类组件有自己的状态(state),用于更新UI。

state的使用:

class App extends React.Component{
    constructor(){
        super()
		//设置state(状态)的值
        this.state=
            {count:0}
    }
    render(){
        return (
            <h2>count的值为{this.state.count}</h2>
        )
    }
}

ReactDOM.render(<App />,document.getElementById('root'))

在这里插入图片描述

class App extends React.Component{
	//简写模式
    state={
        count:1
    }
    render(){
        return (
            <h2>count的值为{this.state.count}</h2>
        )
    }
}

ReactDOM.render(<App />,document.getElementById('root'))

在这里插入图片描述
通过this.setState()方法来修改状态,不能直接修改state中的状态。

class App extends React.Component{
    state={
        count:1
    }
    handClick=()=>{
        this.setState({
            count:this.state.count+1
        })
    }
    render(){
        return (
            <div>
            <h2>count的值为{this.state.count}</h2>
            <button onClick={this.handClick}>count+1</button>
            </div>
        )
    }
}

ReactDOM.render(<App />,document.getElementById('root'))

在这里插入图片描述
在这里插入图片描述
上面使用的是箭头函数,如果使用之前的定义函数的方法,会出现this找不到的问题,而箭头函数本身并没有this,所以会向外寻找从而找到组件里的this.推荐使用上面的方法.
解决this只想问题还有下面这种处理方法:

class App extends React.Component{
    constructor(){
        super()
        this.state={
            count:1
        }
        //用于将handClick的this与组件的this绑定,相当于将函数里的this指向组件的this
        this.handClick=this.handClick.bind(this)
    }
    handClick(){
        this.setState({
            count:this.state.count+1
        })
    }
    render(){
        return (
            <div>
            <h2>count的值为{this.state.count}</h2>
            <button onClick={this.handClick}>count+1</button>
            </div>
        )
    }
}

ReactDOM.render(<App />,document.getElementById('root')

在这里插入图片描述
在这里插入图片描述
组件分为受控组件和非受控组件,
受控组件:

class App extends React.Component{
    state={
        txt:''
    }
    txtChange=(e)=>{
        this.setState({
            txt:e.target.value
        })
    }
    render(){
        return(
            <div>
            	/*在这里绑定一个事件处理程序,当输入框里的文本出现更新时,
            	先触发txtChange更新state,之后重新渲染页面显示新的state.*/
                <input type="text" value={this.state.txt} onChange={this.txtChange}></input>
                <h2>{this.state.txt}</h2>
            </div>
        )
    }
}

ReactDOM.render(<App />,document.getElementById('root'))

在这里插入图片描述
其他受控组件的用法:

class App extends React.Component{
    state={
        txt:'',
        sel:'weman',
        check:true
    }
    txtChange=(e)=>{
        this.setState({
            txt:e.target.value
        })
    }
    selChange=e=>{
        this.setState({
            sel:e.target.value
        })
    }
    checkChange=e=>{
        this.setState({
            check:e.target.checked
        })
    }
    render(){
        return(
            <div>
                <textarea value={this.state.txt} onChange={this.txtChange}></textarea>
                <h2>{this.state.txt}</h2>
                <select value={this.state.sel} onChange={this.selChange}>
                    <option value='man'></option>
                    <option value='weman'></option>
                </select>
                <h2>{this.state.sel}</h2>
                <input type="checkbox" checked={this.state.check} onChange={this.checkChange}
                name="n" />123
                <h2>{this.state.check}</h2>
            </div>
        )
    }
}

ReactDOM.render(<App />,document.getElementById('root'))

在这里插入图片描述
每个都写一个事件处理函数过于繁琐,可以进行一些简化,根据需要处理的标签类型进行相应的处理。

class App extends React.Component{
    state={
        txt:'',
        sel:'weman',
        check:true
    }
    allChange=e=>{
    	//获取标签的类型
        const value=e.target.type==='checkbox'
            ?e.target.checked
            :e.target.value
        this.setState({
            [e.target.name]:value
            //这里使用中括号可以去除''和""
        })
    }
    render(){
        return(
            <div>
            	//name使用与state里面一样的名字一是为了方便区分,而是为了便于获取state里的变量名;
                <textarea value={this.state.txt} onChange={this.allChange} name='txt'></textarea>
                <h2>{this.state.txt}</h2>
                <select value={this.state.sel} onChange={this.allChange} name='sel'>
                    <option value='man'></option>
                    <option value='weman'></option>
                </select>
                <h2>{this.state.sel}</h2>
                <input type="checkbox" checked={this.state.check} onChange={this.allChange}
                name='check'  />123
                <h2>{this.state.check}</h2>
            </div>
        )
    }
}

ReactDOM.render(<App />,document.getElementById('root'))

在这里插入图片描述
非受控组件:
是一种直接操作DOM的方法基本不用,了解

class App extends React.Component{
    constructor(){
        super()
        //创建ref对象
        this.txtRef=React.createRef()
    }
    handClick=e=>{
        //通过ref获取文本的值
        console.log(this.txtRef.current.value)
    }
    render(){
        return (
            <div>
            	//将ref对象绑定到文本框里
                <input type="txt" ref={this.txtRef}></input>
                <button onClick={this.handClick}>点击我获取输入内容</button>
            </div>
        )
    }
}
ReactDOM.render(<App />,document.getElementById('root'))

在这里插入图片描述
在这里插入图片描述

结语

笔者也是第一次学习做出的总结,要是能从我这里得到一些帮助最好不过,若有错误还望大佬在评论帮忙指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值