网站首页 > 基础教程 正文
state属性
react 把组件看成是一个状态机。通过界面与用户行为之间的交互,实现不同状态调整,然后重新渲染 UI,让用户界面和数据保持一致。
react 里,只需更新组件的 state,然后根据新的信息 state 重新渲染用户界面(不要直接操作 DOM元素)。修改State使用this.setState方法,直接使用this.state.num虽然会修改属性,但是无法更新组件。setState并不一定是同步更新的,例如react封装的onClick、onChange等事件是异步提交更新的,而js原生事件是同步更新的。开发中大部分用到的是react封装事件。
要解决state同步更新问题,需要让setState接收一个函数而不是一个对象。this.setState((state,props)=>{num:state.num+1})
import React from "react";
class TestComponment extends React.Component {
constructor(props) {
super(props);
this.state={
num:0
}
}
render() {
const add =() => {
this.setState({
num: this.state.num +1
})
}
const sub = () => {
this.setState({
num: this.state.num - 1
})
}
return(
<div>
<h1>{this.state.num}</h1>
<button onClick={add}>加一</button>
<button onClick={sub}>减一</button>
</div>
)
}
}
export default TestComponment
props属性
props是不可变的,在react单项数据流是通过props实现的。每个组件都含有自己的props属性,父组件向子组件传递消息通过props传输。props中的属性可以指定数据类型。获取props属性通过this.props.xxxx。
const Componment = (props) => {
console.log(props)
return(
<div>
hello {props.user.name}
</div>
)
}
refs属性
refs提供给我们访问DOM节点,或者是react组件的实例的一种方式。一般情况是用不到refs这个属性,因为react不建议我们直接操作底层DOM元素,而是在render函数里去编写我们的页面结构,由React来组织DOM元素的更新。但凡事总有例外,总会有时候需要我们直接去操作页面的真实DOM,这就要求我们有直接访问真实DOM的能力,而refs就是为我们提供了这样的能力。
<input ref="myInput" />
let input = this.refs.myInput;
let inputValue = input.value;
let inputRect = input.getBoundingClientRect();
总结
state属性是可变的,通过改变state状态更新组件;props是不可变的,父子组件中通过props属性从上向下传递数据,保证数据单一流向;refs提供直接操作DOM元素的方法,一般情况下不建议使用,尽可能的使用声明式编程。
- 上一篇: React在开发中的常用结构以及功能详解
- 下一篇: React核心概念
猜你喜欢
- 2024-11-24 React源码分析与实现(一):组件的初始化与渲染「实践篇」
- 2024-11-24 React 最简单的入门应用项目
- 2024-11-24 「干货」深入浅出React组件逻辑复用的那些事儿
- 2024-11-24 「干货满满」React Hooks 最佳实践
- 2024-11-24 React开发必须知道的34个技巧
- 2024-11-24 React组件应该如何封装?
- 2024-11-24 React.js前端框架初学技术总结
- 2024-11-24 前端架构师成长之路:5 分分钟搞懂面试官必问 React 题
- 2024-11-24 只会Vue的我,用两天学会了react,这个方法您也可以
- 2024-11-24 react高质量笔记_9(Diffing算法)
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)