(React入门)状态state与属性props

2023-10-29

状态(State)

State介绍
状态 state:使用this.state来引用,state本身就是状态的意思,状态指的是事物所处的状况,状况就是环境。
通常使用state存储简单的视图状态,比如说下拉框是否显示、单选 是否选中,或者需要自身去维护的变化数据等。

组件中用到的某个变量是不是应该作为组件State,可以通过下面的5条依据进行判断:

  • 这个变量是否是通过props从父组件中获取?如果是,那么它不是一个状态。
  • 这个变量是否在组件的整个生命周期中都保持不变?如果是,那么它不是一个状态。
  • 这个变量是否可以通过其他状态(State)或者属性(Props)计算得到?如果是,那么它不是一个状态。
  • 这个变量是否在组件的render方法中使用?如果不是,那么它不是一个状态。这种情况下,这个变量更适合定义为组件的一个普通属性,例如组件中用到的定时器,就应该直接定义为this.timer,而不是this.state.timer。
  • 这个变量修改后,是否要更新组件?是,那么它是一个状态

设置默认state

class Test extends React.Component{
    constructor(props){
        super(props);
        //默认状态
        this.state = {
            isShow:true
        }
    }
    render(){
        return <div style={display:this.state.isShow?'block':'none'}>This is component!</div>
    }
}

修改state

常用的通知 React 数据变化的方法是调用 setState(data, callback)。这个方法会合并(merge) data 到 this.state并重新渲染组件。渲染完成后,调用可选的 callback 回调。大部分情况下不需要提供 callback,因为 React 会负责把界面更新到最新状态。

this.setState({
  isShow:false
})

setState会触发diff算法:判断state和页面结果的区别,是否需要更新

setState详解

props基本使用

props是组件(包括函数组件和class组件)间的内置属性,用其可以传递数据给子节点。
props在传递数据的过程中,是只读的不能修改。

键值对

1.父组件调用子组件时传入属性
2.子组件直接通过this.props.属性名即可拿到父组件传过来的值

//父组件
import React, { Component } from 'react'
import Child from './Child '
export default class Props extends Component {
  state = {
      title:"Hello world",
  }
  render() {
    return (
      <div>
        <div><h3>首页</h3><Child title={this.state.title}></Child></div>
      </div>
    )
  }
}
//子组件
import React, { Component } from 'react'
export default class Child extends Component {
    render() {
        console.log(this.props)
        return (
            <div>{this.props.title}</div>
        )
    }
}

展开语法{…props}

使用展开语法,React就会自动把对象中的变量和值当作是属性的赋值

//父组件
import React, { Component } from 'react'
import Child from './Child '
export default class Props extends Component {
  state = {
      title:"Hello world",
      name:"React"
  }
  render() {
    return (
      <div>
        <div><h3>首页</h3><Child {...this.state}></Child></div>
      </div>
    )
  }
}
//子组件
import React, { Component } from 'react'
export default class Child extends Component {
    render() {
        console.log(this.props)
        return (
            <div>{this.props.title}</div>
        )
    }
}

props传函数

1.父组件调用子组件时传入函数属性
2.子组件直接通过this.props.fun()即可调用父组件传过来的函数

//父组件
import React, { Component } from 'react'
import Child from './Child '
export default class Props extends Component {
  state = {
      title:"Hello world",
  }
  trigger(){
    return "Hello React"
  }
  render() {
    return (
      <div>
        <div><h3>首页</h3><Child title={this.state.title} fun={this.trigger}></Child></div>
      </div>
    )
  }
}
//子组件
import React, { Component } from 'react'
export default class Child extends Component {
    render() {
        console.log(this.props)
        return (
            <div>{this.props.title}</div>
            <div>{this.props.fun()}</div>
        )
    }
}

props验证

引入prop-types用来校验父组件传递过来值的类型

propTypes/defaultProps

1.propTypes用来验证类型和是否必传
2.defaultProps:用来设置未传参时的默认值

import React, { Component } from 'react'
import PropTypes from "prop-types"
export default class Child extends Component {
    render() {
        return (
            <div>{this.props.title}</div>
        )
    }
}
//类属性
Child.propTypes = {
    title: PropTypes.string
}
Child.defaultProps= {
    title: "Hello"
}

利用static静态属性将验证写在类的里面

import React, { Component } from 'react'
import PropTypes from "prop-types"
export default class Child extends Component {
//类属性
	static propTypes = {
	    title: PropTypes.string
	}
	static defaultProps= {
	    title: "Hello"
	}
    render() {
        return (
            <div>{this.props.title}</div>
        )
    }
}

PropTypes的种类

React PropTypes的种类有

PropTypes.array           // 队列
PropTypes.bool.isRequired // Boolean 且必须
PropTypes.func            // 函数
PropTypes.number          // 数字
PropTypes.object          // 对象
PropTypes.string          // 字符串
PropTypes.node            // 任何类型的: numbers, strings, elements 或者数组
PropTypes.element         // React 元素
PropTypes.instanceOf(XXX) // 某种XXX类型的对象
PropTypes.oneOf(['foo', 'bar']) // 其中的一个字符串
PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.array]) // 其中的一种类型
PropTypes.arrayOf(React.PropTypes.string)  // 某种类型的数组(字符串)
PropTypes.objectOf(React.PropTypes.string) // 元素是字符串的对象
PropTypes.shape({                          // 是否符合指定格式的对象
  color: React.PropTypes.string,
  fontSize: React.PropTypes.number
});
PropTypes.any.isRequired  // 可以是任何格式,且必要。
// 自定义格式,不符合的时候放回Error
// 不要用`console.warn` 或者 throw, 因为它在`oneOfType` 的情况下无效
customPropType: function(props, propName, componentName) {
  if (!/^[0-9]/.test(props[propName])) {
    return new Error('Validation failed!');
  }
}

属性和状态的区别

propsstate 的相似点:

  • 都是 js 对象,更新数据后会都会触发 render() 更新;
  • 都可以设置默认值;props 通过 defaultProps 属性设置默认值;state 直接在定义的时候设置初始值;

propsstate 的不同点:

  • 属性是从父组件获取的,状态是在当前组件中定义的;
  • 属性值只能由父组件修改,状态值只能由当前组件修改;
  • 属性主要用于父组件和子组件间的通信,在组件内部是无法修改参数的;
  • 状态是给自己用的,在内部初始化,被自己修改,在外部是不能修改的,内部通过 setState 修改,会触发render函数;

总结:stateprops 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变。这就是为什么有些容器组件需要定义 state 来更新和修改数据。 而子组件只能通过 props 来传递数据。


在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(React入门)状态state与属性props 的相关文章

随机推荐

  • QT 发布软件基本操作

    一 配置环境变量 找到Qt安装时的bin目录的路径 D Qt Qt5 14 2 5 14 2 mingw73 64 bin 将目录拷贝至下述环境变量中 打开计算机的高级系统设置 选中环境变量 gt 系统变量 gt Path 点击编辑 gt
  • javascript 将数组转换为字符串方法总结

    1 String arr 输出数组的每个元素值 用逗号分隔 2 arr join 分隔符 输出数组的每个元素之 用指定的分隔符分隔
  • 循环队列的实现(初始化、入队操作、出队操作、判满、判空、获取队头、队尾元素、销毁操作)

    typedef struct int array int front int rear int count 用count 的方式判断循环队列是否满 int N 总个数 MyCircularQueue 初始化 MyCircularQueue
  • 宝塔面板最全最快搭建https访问网站终极版教程

    我的个人博客 网址 https www minikuba com 迷你酷吧是一个基于程序员经验为基础分享技术文章 算法解题 大厂面试真题 热门项目的平台 致力于为大家提供更多涵盖前后端技术 技能的学习 助力广大热衷编程开发者全面发展 本文章
  • 动态集合和静态集合的不同

    ul li 1 li li 2 li li 3 li li 4 li li 5 li li 6 li ul
  • 铰接式车辆的横向动力学仿真提供车辆模型研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 铰接式车辆是一种具有铰接连接的多体系统 具
  • 【乌拉喵.教程】不同负载下继电器的保护电路设计(解决继电器触点粘接的问题)

    最近将多年来收集到的教学视频 国内外图书 源码等整理整合拿出来 涉及arm Linux python 信号完整性 FPFA DSP 算法 stm32 单片机 制图 电子模块 kali 出版社图书等 资料目前约1 5TB 详情 1 5TB 电
  • 当Selenium遇到TestNG

    当Selenium遇到TestNG 用 Selenium 测试 Web 页面时 所重现的各种行为依赖于测试人员的输入参数 例如 选择下拉餐单的项目 在文本框中输入字符等 不同的测试用例对应不同的输入 若有方法能够简单 有效的传入测试用参数
  • 图片自适应屏幕大小的css写法

    如果想让图片自适应屏幕的小而不是宽高固定不变可以在css代码里加入 img height auto width auto 9 width 100 用max width设置如果图片尺寸大于当前浏览器尺寸就自动缩放 图片的高度设置正比缩放 但是
  • 设计模式七大原则详解

    文章目录 一 java为什么要有设计模式 二 设计模式七大原则 三 单一职责原则 四 接口隔离原则 五 依赖倒转原则 六 里氏替换原则 七 开闭原则 八 迪米特法则 一 java为什么要有设计模式 写代码就像建楼房一样 要考虑到它后期是否以
  • 从0开始学go第四天

    模板继承 继承根模板 重新定义 块模板 Go Web开发系列教程 07 Go模板继承 哔哩哔哩 bilibili 解析模板时 base模板要在前 渲染模板时 要用ExecuteTemplate 而不是Excute 模板补充 Go语言标准库之
  • 电子竞赛项目回顾——基于多物料识别分拣的离线式监管工业流水线系统

    1 项目简介 本项目融合了工业物联网技术 FPGA图像处理等技术 针对工业流水线上的多物料分拣 提出了一种自下而上全自动化式 工厂监管离线式的解决方案 工厂内部所有的控制层 感知层均通过无线传输层与工厂总控主机相连 同时主机实时将工厂运行的
  • linux之关机、重启命令

    Linux几种关机 重启 相关命令 在linux下一些常用的关机 重启命令有shutdown halt reboot 及init 它们都可以达到重启系统的目的 但每个命令的内部工作过程是不同的 通过本文的介绍 希望你可以更加灵活的运用各种关
  • Tree 【POJ - 3237】【树链剖分+一些特殊的处理】

    题目链接 这道题 说来还的确困扰了我一个多小时 当时就在想 我该如何处理那些边权 我将边化为点 以及点 默认权值为0 的取相反数后的处理 因为点取相反数之后还是0 会困扰到那些边的 然后 我想到了 如果这段区间的返回的值为0 那么就说明了肯
  • podman 是什么?和 docker 有什么区别?

    什么是 podman Podman 是一种无守护进程的容器引擎 可以创建 管理和运行 OCI 容器 容器可以以非 root 身份运行 也可以使用 root 身份运行 Podman 是由 Red Hat 开发 从 Red Hat Enterp
  • 【BAT 多IF条件实例】

    echo off start 设置常用过滤关键字 set key1 202008 set key2 202009 set key3 20200919 打印出常用关键字 echo 1 key1 2 key2 3 key3 读取用户输入 set
  • Android Studio Git功能使用

    Android Studio Git功能使用 简介 常用功能 提交代码到远程分支 合并分支代码 拉新分支 简介 在Android Studio中使用自带的Git管理工具来进行版本管理 可以轻松应对需要频繁进行本地分支和远程分支操作的项目 比
  • 成功解决pip/conda install cartopy安装失败问题

    使用pip 或conda 安装cartopy pip install cartopy 报错 ERROR Command errored out with exit status 1 command home mlli anaconda3 e
  • 前端学习笔记

    笔记 小知识 V ON绑定事件 V BIND绑定属性 Network中可以查看当前发起的请求 XHR这个标签出现在Chrome浏览器的开发者工具Network选项卡中 XHR类型即通过XMLHttpRequest方法发送的请求即AJAX请求
  • (React入门)状态state与属性props

    状态 State State介绍 状态 state 使用this state来引用 state本身就是状态的意思 状态指的是事物所处的状况 状况就是环境 通常使用state存储简单的视图状态 比如说下拉框是否显示 单选 是否选中 或者需要自