首页 > 其他分享 >React笔记-state(四)

React笔记-state(四)

时间:2023-05-09 21:13:51浏览次数:37  
标签:info render 笔记 React state 组件 setState

React学习笔记-state(四)

概念

state的主要作用是用于组件保存 控制以及修改自己的状态 它算是组件的私有属性 不可通过外部访问和修改 只能通过组件内部的this.setState来修改 修改state属性会导致组件的重新渲染

注意:

如果直接通过this.state.xxx的方式修改,组件不会重新渲染,但是值会被修改。并且这也是不规范的行为

state定义及使用

import React from "react";

export default class LearnState extends React.Component {

  // 一个组件只会定义一个state对象 直接定义在组件内部
  state = {
    name : 'bob'
  }

  render () {
    console.log('setState被修改, render重新渲染')
    return (
      <div>
        {/* 使用state值 */}
        <div>{this.state.name}</div>
      </div>
    )
  }
}

setState方法及其异步问题

使用setState方法 会调用render方法重新渲染页面

import React from "react";

export default class LearnState extends React.Component {

  // 存在异步问题
  state = {
    num : 1
  }
  addNum () {
   // 每次调用setState修改值都会调用render重新渲染页面
    this.setState ({
      num : this.state.num + 1
    })
    // 这里打印在控制台的永远比页面渲染的小1 因为setState里面代码是异步的
    console.log(this.state.num)
  }

  render () {
    console.log('setState被修改, render重新渲染')
    return (
      <div>
        {/* 存在异步问题 数据和页面渲染不一样 */}
        <div>{this.state.num}</div>
        <button onClick={() => this.addNum()}>+1异步</button>
      </div>
    )
  }
}

解决异步问题

import React from "react";

export default class LearnState extends React.Component {

  // 异步问题得到解决
  state = {
    num : 1
  }
  addNum () {
    this.setState ({
      num : this.state.num + 1
      // setState可以传入第二个参数回调函数 将打印语句写到微任务中(即异步体内)
    }, () => {console.log(this.state.num)})
  }

  render () {
    console.log('setState被修改, render重新渲染')
    return (
      <div>
        {/* 解决异步问题 */}
        <div>{this.state.num}</div>
        <button onClick={() => this.addNum()}>+1异步</button>
      </div>
    )
  }
}

state中复杂类型数据修改(不推荐)

import React from "react";

export default class LearnState extends React.Component {

  // 以下方法在类组件中可以使用 在函数组件中不推荐 不规范写法
  state = {
    info : {name : 'bob', age : 18}
  }
  changeName (event) {
    // state的值不应该被直接修改
    this.state.info.name = event.target.value;
    // 渲染视图
    this.setState({
      info : this.state.info
    })
  }

  render () {
    console.log('setState被修改, render重新渲染')
    return (
      <div>
        {/* 此方法在函数组件中不推荐 */}
        <div>{this.state.info.name + '-->' + this.state.info.age}</div>
        <input type="text" onChange={(event) => this.changeName(event)}/>修改对象name值
      </div>
    )
  }
}

state中复杂类型数据修改(推荐)

import React from "react";

export default class LearnState extends React.Component {
  // state中存复杂数据类型 对其进行修改 以下方法在类组件和函数组件都推荐
  state = {
    arr : [1, 2, 3],
    info : {name : 'bob', age : 18}
  }
  addArr () {
    this.setState({
      // 将原数组扩展 和 新数据拼接成新数组给arr
      arr : [
      ...this.state.arr,
      this.state.arr.length + 1
      ]
    })
  }
  changeName (event) {
    // console.log(event.target.value)
    this.setState({
      info : {
        // 将原对象扩展 和 新数据拼接成新对象给info
        ...this.state.info,
        name : event.target.value
      }
    })
  }

  render () {
    console.log('setState被修改, render重新渲染')
    return (
      <div>
        {/* 此方法在类组件和函数组件中都推荐 */}
        <div>{this.state.arr}</div>
        <button onClick={() => this.addArr()}>修改数组</button>
        <div>{this.state.info.name + ' --> ' + this.state.info.age}</div>
        <input type="text" onChange={(event) => this.changeName(event)}/>修改对象name值 */}

        {/* 对象不允许作为参数直接使用 会报错
        <div>{this.state.info}</div> */}
      </div>
    )
  }
}

标签:info,render,笔记,React,state,组件,setState
From: https://www.cnblogs.com/SpicyPeper/p/17386279.html

相关文章

  • 中国剩余定理学习笔记
    给定\(n\)组非负整数\(a_i,b_i\),其中\(b_i\)两两互质,求解关于\(x\)的方程组的最小非负整数解。\(\begin{cases}x\equivb_1\({\rmmod}\a_1)\\x\equivb_2\({\rmmod}\a_2)\\...\\x\equivb_n\({\rmmod}\a_n)\end{cases}\)这样的题怎么做呢?首先给出中......
  • 最小表示法 学习笔记
    描述:给出一个字符串s,将s循环移位若干次之后使得字符串的字典序最小。朴素的思路:对于每一个位置为结果字符串的开头去暴力做。显然最坏复杂度O(|S|^2)于是考虑优化这个过程。假设对于不同的两个下表i和j,如果有s[i,i+1,..,i+k-1]=s[j,j+1,..,j+k-1]和s[i+k]>s[j+k],那这个时候i已......
  • 笔记本自带键盘如何关闭
    左下角搜索栏中搜索cmd,以管理员身份运行在弹出的窗口中将下面这段代码输入进去,并回车。scconfigi8042prtstart=disabled重启,笔记本自带键盘关闭如果想恢复,只要外置键盘以同样方法输入下面这个代码,重启即可。scconfigi8042prtstart=auto......
  • 【笔记】编译原理 - 中
    5语法制导翻译考虑语义分析——为CFG中的文法符号设置语义属性;在语法分析树上,语义属性值用与文法符号所在产生式(语法规则)相关联的语义规则来计算语义规则同语法规则(产生式)相联系,涉及概念:语法制导定义(Syntax-DirectedDefinitions,SDD)语法制导翻译方案(Syntax-Directe......
  • 论文阅读笔记《Training Socially Engaging Robots Modeling Backchannel Behaviors w
    TrainingSociallyEngagingRobotsModelingBackchannelBehaviorswithBatchReinforcementLearning训练社交机器人:使用批量强化学习对反馈信号行为进行建模发表于TAC2022。HussainN,ErzinE,SezginTM,etal.TrainingSociallyEngagingRobots:ModelingBackc......
  • ReactHub:我用 ChatGPT 搞了一个 React 的资源导航网站,谁有我用心啊!
    大家好,我是DOM哥。图谱年年有,今年我来盘!之前已经盘完了Vue的技术图谱,今天来盘React的。我用ChatGPT开发了一个React的资源导航网站。不管你是资深React用户,还是刚入门想学习React的小白,这个网站都能帮助到你。网站地址:https://dombro.site/react#/react项目托管......
  • 扩展中国剩余定理学习笔记
    给定\(n\)组非负整数\(a_i,b_i\),求解关于\(x\)的方程组的最小非负整数解。\(\begin{cases}x\equivb_1\({\rmmod}\a_1)\\x\equivb_2\({\rmmod}\a_2)\\...\\x\equivb_n\({\rmmod}\a_n)\end{cases}\)首先我们看一下只有1个方程的情况:$x\equivb_......
  • MySQL笔记之文件和日志
    一、存储文件1、存放位置MySQL数据库会在data目录下,以数据库为名,为每一个数据库建立文件夹,用来存储数据库中的表文件数据。不同的数据库引擎,每个表的扩展名也不一样,例如:MyISAM用“.MYD”作为扩展名,Innodb用“.ibd”等。 2、FRM表结构信息文件无论是哪种存储引擎,创建表之......
  • react 杂记2
    大括号-JavaScript的“新世界”{变量}  {方法(param)}  {逻辑}   {逻辑+html}  {}里面还是可以应用变量 再用{}获取即可 函数(onClick),变量(movieName),插槽(children),都是作为props传递给子组件的 添加事件注意:传递的是一个函数 自定义事件: 以o......
  • React Native之React基础
    ReactNative的基础是React,是在web端非常流行的开源UI框架。要想掌握ReactNative,先了解React框架还是很有帮助的。主要理解三个概念:组件、状态和JSX。使用组件的方式描述UI 使用组件的方式描述UI在React中,所有的UI都是通过组件去描述和组织的。可以认为,Reac......