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】三大属性之state、props、ref -> 正文阅读

[JavaScript知识库]【React】三大属性之state、props、ref

目录

1.state

1、状态类型为不可变类型

2、状态类型为数组

3、状态的类型是普通对象

2.props

props属性特点

父组件给子组件传递数据:

3.Refs

React.createRef()


1.state

React把每一个有状态的组件都看成是一个状态机,组件内部通过state来维护组件状态的变化。

在事件中触发setState()来修改state数据,state改变后会重新进行render()

在需要对用户输入、服务器请求或者时间变化等做出响应时,使用state。

React目前支持的事件列表:

1、不能直接修改state

组件修改state,并不会重新触发render

2、state的更新是异步的

??调用setState时,组件state并不会立即改变,只是把要修改的状态放入事件队列当中,react会优化真正的执行时机,如果连续写多次setState,会将多次setState的状态修改合并成一次状态修改

3、state的更新是一个合并的过程

??当调用setState()修改组件的状态时,只需要传入发生改变的state,而不是完整的state,因为组件state的更新是一个合并的过程

state当中的某一个状态发生变化时,应该重新创建这个状态对象,而不是直接修改原来的state状态,那么当状态发生变化时,如何去创建新的状态呢,我们根据状态类型可以分为下面三种情况:?

1、状态类型为不可变类型

number、string、boolean、null、undefined

2、状态类型为数组

//方法一:使用preState,concat创建新数组
 this.setState((prevState)=>({
books: prevState.books.concat(['React Guide'])
}))

//方法二:ES6 spread syntax
this.setState(prevState=>({
books:[...prevState,'React Guide']
}))

当我们从books中截取部分元素作为新状态时,可以用数组的slice方法:

this.setState(prevState=>({
books: prevState.books.slice(1,3);
}))

当从books中过滤部分元素后,作为新状态时,可以使用filter方法:

this.setState(prevState=>({
books: prevState.books.filter(item=>{
  return item!='React';
})
}))

【注意】不要使用push,pop,shift,unshift,splice等方法修改数组类型的状态,因为这些方法都是在原数组的基础上修改的,而concat,slice,filter会返回一个新的数组。

3、状态的类型是普通对象

使用es6的Object.assgin()方法

this.setState({
onwer: Object.assgin({},preState.onwer,{name:'Jason'});
})

//或者使用对象扩展语法
this.setState(preState=>{
owner: {...preState.owner, name:'Jason'}
})

2.props

props属性特点

(1)React中的数据流是自上而下,从父组件流向子组件

(2)子组件从父组件提供的props中获取数据,并进行渲染,一般是纯展示的组件。

(3)如果父组件的props更新,则该组件下面所有用到这个属性的子组件,都会重新进行render()

(4)props是只读的,props是只读的,props是只读的。不要试图修改props,否则会报错。

(5)propTypes进行类型检查

校验类型包括基本类型、对象、数组、枚举。

import React, { Component } from 'react'
import PropTypes from 'prop-types';
export default class MyComponent extends Component{
state={
}
static MyComponent.propTypes = {
    //static 关键字添加静态属性
    // 默认情况下这些属性都是可选的
    optionalArray: PropTypes.array,
    optionalBool: PropTypes.bool,
//如果某个属性是必须的,那么就在类型后面加上isRequired:
    requiredFunc: PropTypes.func.isRequired,
}

父组件给子组件传递数据:

//父组件
<input name="Peter" />

//子组件读取:
import React, { Component } from 'react'
export default class Mytg extends Component{
constructor(props){
    super();
    
}
 render() {
        return (
            <div>Hello,{this.props.name}</div>
        );
    }
}

3.Refs

虽然也可以通过document.getElementById(“xxx”)来获取Dom节点,但React推荐不要直接操作Dom节点,只有用Refs才是访问组件内部Dom元素的唯一可靠方法。

有三种方法可以创建ref,分别为:字符串形式的ref(已弃用)、回调形式的ref、createRef

React.createRef()

如果是v16.3之后的React,那么可以使用这种方法。

//创建Refs:
this.myref = React.createRef();

//通过ref属性来获取React元素
return <input ref={this.myref} />;

//访问Refs:
const A = this.myRef.current.value;

(1)可以在类组件上使用ref属性

(2)不能在函数组件上使用ref属性,因为函数组件没有实例。

(3)可以在函数组件内部可以使用ref属性,只要它指向一个 DOM 元素或者 class 组件。

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

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:40:26-

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