IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React-4(state、props、表单、通信、生命周期) -> 正文阅读

[JavaScript知识库]React-4(state、props、表单、通信、生命周期)

目录

一、state(状态)

1、读取状态

2、修改状态

3、setState注意点

二、属性props(只读)

1、数据传递

2、属性验证

3、默认属性

三、表单

1、受控表单组件

1.1、理解

1.2、实现步骤

2、非受控表单组件

四、通信

1、父组件向子组件传递

1.1、步骤

1.2、实现

2、子组件向父组件传递

2.1、步骤

2.2、实现

3、兄弟组件通信

4、发布订阅模式

5、context状态树传参(官方提供)

步骤

五、生命周期(钩子函数)

1、初始化阶段

1.1、componentWillMount

1.2、render

1.3、componentDidMount

2、运行中阶段

2.1、componentWillReceiveProps(nextProps)

2.2、shouldComponentUpdate(nextProps,nextState)

2.3、render

2.4、componentDidUpdate(preProps,preState)

3、销毁阶段

componentWillUnmount


一、state(状态)

设置了state的组件称之为有状态组件

没有设置state的组件称之为无状态组件

1、读取状态

export class exer extends Component {
  state = {
    count: 0,
  }
  render() {
    return (
      <div>{this.state.count}</div>
    )
  }
}

2、修改状态

this.setState({ 要修改的数据 })

注意:不能直接修改state中的值(例如:state:this.state.count = 1),必须通过setState方法进行修改

export class exer extends Component {
  state = {
    count: 0,
  }
  setcount = () => {
    this.setState({
      count: this.state.count + 1,
    })
  }
  render() {
    return (
      <div>
        <p>{this.state.count}</p>
        <button
          style={{
            width: '50px',
            height: '20px',
          }}
          onClick={
            this.setcount
          }
        >
          按钮
        </button>
      </div>
    )
  }
}

3、setState注意点

在同步逻辑中,异步更新状态与真实dom

在异步逻辑中,同步更新状态与真实dom

接受第二个参数,是个回调函数,在这里状态与dom更新完成

二、属性props(只读)

1、数据传递

props是为了更好的实现复用性,从外部接受数据

//父组件
<MyNav title={this.title} />


//MyNav.js组件
render(){
?return (
? <div>
? ? <p>{this.props.title}<p/>
? </div>
?)
}

2、属性验证

import mypro from 'prop-types'
static proTypes={
? ?title: mypro.string,
? ?letBtn: mypro.bool
}

3、默认属性

static defaultProps={
? ? ? title: '首页'
}

三、表单

1、受控表单组件

1.1、理解

input框自己的状态被React组件状态控制就是受控组件

1.2、实现步骤

2.1、在组件的state中声明组件的状态数据

2.2、将状态数据设置为input标签元素的value属性的值

2.3、为input添加change事件,通过事件对象e获取到当前文本框的值

2.4、调用setState方法,将文本框的值作为state状态的新值

export class exer extends Component {
//组件状态数据
  state = {
    mesg: 'msg',
  }
//通过事件对象e获取当前文本框的值,并把文本框的值作为state状态的新值
  getinput = (e) => {
    this.setState({
      mesg: e.target.value,
    })
  }
  render() {
    return (
      <div>
       <input value={this.state.mesg} onChange={this.getinput}/>
      </div>
    )
  }
}

2、非受控表单组件

通过操作DOM获取文本框的值

在constructor中React.createRef()

四、通信

1、父组件向子组件传递

使用属性值

1.1、步骤

1、父组件提供传递的数据

2、给子组件标签添加属性,值为state中的数据

3、子组件中通过props接收父组件中传过来的数据

1.2、实现

// 子组件
export class tab extends Component {
  render() {
    return (
      <div>
       {this.props.msg}
      </div>
    )
  }
}

// 父组件
export class exer extends Component {
  state = {
    mesg: 'msg',
  }
  render() {
    return (
      <div>
       <tab msg={this.state.mesg} />
      </div>
    )
  }
}

2、子组件向父组件传递

使用回调函数

2.1、步骤

1、父组件提供一个回调函数,用于接收数据

2、将函数作为属性的值,传给子组件

3、子组件通过props调用回调函数

4、将子组件中的数据作为参数传给回调函数

2.2、实现

// 子组件
export class tab extends Component {

  render() {
    return (
      <div>
       <p
       onClick={() =>{
          this.props.changeMes("返回数据")
        }
       }
       >tab</p>
      </div>
    )
  }
}

// 父组件
export class exer extends Component {
  state = {
    mesg: 'msg',
  }
  changemes = (newmsg) => {
    this.state({
      meg: newmsg
    })
  }
  render() {
    return (
      <div>
       <tab changeMes={this.changemes} />
      </div>
    )
  }
}

3、兄弟组件通信

由父组件充当中间人,利用子传父+父传子模式完成

1、公共父组件提供共享状态,提供共享状态的方法

2、要接收数据状态的子组件通过 props 接收数据

3、要传递数据状态的子组件通过props接收方法,调用方法传递数据

4、发布订阅模式

let? bus = {
? ?list:[],? ?//存放订阅者
? ?//订阅者
? ?subscrible(cb){
? ? ? this.list.push(cb);
? ?},
? ?//发布者
? ?publish(text){
? ? ? this.list.forEach(cb => cb &&? cb(text))
? ?}
}

5、context状态树传参(官方提供)

Context提供了一个无需为每层组件手动添加props,就能在组件树间进行数据传递的方法

步骤

1、创建Context对象

const GlobalContext = React.createContext()

2、使用GlobalContext.Provider包裹上层组件提供数据

<GlobalContext.Provider? value = {{a:1,b:2}}>
? ? ? <p></p>
? ? ??<p></p>
</GlobalContext.Provider>

3、需要用到数据的组件使用GlobalContext.Consumer包裹获取数据

<GlobalContext.Consumer>
? ?{
? ? ? value =>{
? ? ? ? ?return? (
? ? ? ? ? ? <div>子组件{value}</div>
? ? ? ? ?)
? ? ? }
? ?}
</GlobalContext.Consumer>

五、生命周期(钩子函数)

1、初始化阶段

1.1、componentWillMount

组件即将挂载,render之前最后一次修改state的机会

常用于:state的初始化

备注:如果有警告,可使用UNSAFE_componentWillMount

1.2、render

只能访问props与state,不能修改state及进行dom输出

1.3、componentDidMount

成功执行完毕render并完成dom节点的渲染,可以对dom修改

常用于:axios请求,订阅函数调用,计时器,dom操作

2、运行中阶段

2.1、componentWillReceiveProps(nextProps)

父组件修改属性触发

最先获取父组件传来的属性,可以在这里进行axios请求或者其他逻辑处理

备注:如果有警告,可使用UNSAFE_componentWillReceiveProps

2.2、shouldComponentUpdate(nextProps,nextState)

返回false,会阻止render的调用

参数是被修改之后的新的属性及状态

2.3、render

只能访问props与state,不能修改state及进行dom输出

2.4、componentDidUpdate(preProps,preState)

可以修改dom

参数是被修改之前的属性及状态

3、销毁阶段

componentWillUnmount

在删除组件前进行清理工作

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:06:34  更:2022-10-22 21:07:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/11 17:07:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码