react 学习笔记
_自定义的组件都必须要用大写字母开头,普通的 HTML 标签都用小写字母开头_。
没有经过特殊处理的话,这些
on\*的事件监听只能用在普通的 HTML 的标签上,而不能用在组件标签上React.js 的事件监听方法需要手动
bind到当前实例,这种模式在 React.js 中非常常用。当我们要改变组件的状态的时候,不能直接用
this.state = xxx这种方式来修改,如果这样做 React.js 就没办法知道你修改了组件的状态,它也就没有办法更新页面。所以,一定要使用 React.js 提供的setState方法,它接受一个对象或者函数作为参数。React.js 内部会把 JavaScript 事件循环中的消息队列的同一个消息中的
setState都进行合并以后再重新渲染组件。可以通过给组件添加类属性
defaultProps来配置默认参数。props一旦传入,你就不可以在组件内部对它进行修改。但是你可以通过父组件主动重新渲染的方式来传入新的props,从而达到更新的效果。没有
state的组件叫无状态组件(stateless component),设置了 state 的叫做有状态组件(stateful component)对于用表达式套数组罗列到页面上的元素,都要为每个元素加上
key属性,这个key必须是每个元素唯一的标识。
受控组件:
React.js 认为所有的状态都应该由 React.js 的 state 控制,只要类似于<input />、<select />、<textarea>这样的输入控件被设置了 value 值,那么它们的值永远以被设置的值为准。值不变,value 就不会变化。
在 React.js 当中必须要用 setState 才能更新组件的内容,所以我们需要做的就是:监听输入框的 onChange 事件,然后获取到用户输入的内容,再通过 setState 的方式更新 state 中的 username,这样 input 的内容才会更新。
子组件传递消息给父组件
父组件只需要通过 props 给子组件传入一个回调函数。子组件调用 props 中的回调函数并且将 state 传入该函数即可。
举例:
状态提升
当某个状态被多个组件依赖或者影响的时候,就把该状态提升到这些组件的最近公共父组件中去管理,用 props 传递数据或者函数来管理这种依赖或着影响的行为。
对于不会被多个组件依赖和影响的状态(例如某种下拉菜单的展开和收起状态),一般来说只需要保存在组件内部即可,不需要做提升或者特殊的管理。
操作 DOM
1. 使用回调: 在元素上加一个 ref 属性,这个属性值是一个函数,这个节点挂载到页面上后,这个 dom 节点会作为参数传给这个函数
1 | // 把这个 div 保存到 this 上 |
然后我们就可以在 componentDidMount中 或之后使用这个 DOM 元素
2. 使用 React.createRef()
1 | // 在 constructor 中声明 |
- _能不用
ref就不用_。特别是要避免用ref来做 React.js 本来就可以帮助你做到的页面自动更新的操作和事件监听。多余的 DOM 操作其实是代码里面的“噪音”,不利于我们理解和维护。 - 组件标签也可以加上
ref,此时获取的是组件实例。
props.children
组件标签也能像普通的 HTML 标签那样编写内嵌的结构
1 | render() { |
React.js 默认就支持这种写法,所有嵌套在组件中的 JSX 结构都可以在组件内部通过 props.children 获取到,props.children 是一个数组,React.js 就是把我们嵌套的 JSX 元素一个个都放到数组当中。
PropTypes
引入 prop-types
使用
1 | class a extends Component { |
通过 PropTypes 给组件的参数做类型限制,可以在帮助我们迅速定位错误,这在构建大型应用程序的时候特别有用;另外,给组件加上 propTypes,也让组件的开发、使用更加规范清晰。