组件的三大核心属性
state
statestate是组件对象最重要的属性, 值是对象(可以包含多个key-value的组合)组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新渲染组件)
类式组件示例
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
class Timer extends React.Component {
// 初始化状态,这里的状态就是当前的秒数
constructor(props) {
super(props);
// state初始化,这里可以直接使用 = 初始化
this.state = {seconds: 0};
}
// 定义tick方法,用于给秒数+1
// 注意: 状态数据只能调用setState方法更新,不可以直接操作
// 3. 让自定义函数在构造器中初始化bind() 从而绑定this
tick() {
this.setState(state => ({
seconds: state.seconds + 1
}));
}
// 组件被挂载时,启用interval
componentDidMount() {
// 注意,这里的this对象是当前组件的实例
// 自定义方法中this对象为undefined,解决办法有:
// 1. 箭头函数
// this.interval = setInterval(() => this.tick(), 1000);
// 2. 强制绑定this: 通过函数对象的bind()
this.interval = setInterval(function () {
this.tick();
}.bind(this), 1000);
}
// 组件被移除时,停止interval
componentWillUnmount() {
clearInterval(this.interval);
}
render() {
return (
<div>
Seconds: {this.state.seconds}
</div>
);
}
}
ReactDOM.render(
<Timer/>,
document.getElementById('app')
);
</script>
</body>
</html>函数式组件示例(hooks)
注意:
组件中render方法中的this为组件实例对象
组件自定义的方法中this为undefined,如何解决?
强制绑定this: 通过函数对象的bind()
箭头函数
状态数据,不能直接修改或更新
props
props就像HTML标签的属性。
每个组件对象都会有props(properties的简写)属性
组件标签的所有属性都保存在props中
每个props都是只读的
作用:
通过标签属性从组件外向组件内传递变化的数据
注意: 组件内部不要修改props数据
...批量传递props
...批量传递props下面的代码与上面的代码相同。
对props进行限制
对上述组件的props添加指定的规则:
name必传,且必须为字符串age可选,但是必须为数字类型,并给默认值0sex可选,并给默认值男
15版本的React,直接使用React.PropTypes.string,在16版本,需要引入新的prop-types.js模块:
或者将规则写到类内部:
函数式组件使用props
propsrefs
refs类似选择器,可以给标签增加ref属性,并通过this.refs、回调等形式,获取到指定的元素。
字符串形式的ref (废弃)
ref (废弃)字符串类型的
ref效率有问题,会在未来的版本中移除
回调形式的ref
refcrateRef() 推荐
crateRef() 推荐构造器
在React中,构造的主要作用有两个:
给
state初始化为事件处理函数绑定实例
如果需要
props,那么一定要重写默认构造,并调用super(props),否则可能会出现undefined错误
最后更新于
这有帮助吗?