react 受控组件
表单元素比如 ,
react 可组合组件
在 props
对象中还有一个小小的属性可供使用: children
属性。通过它你可以将元素从上层传递到你的组件中。
React 事件须知
React
所有事件都挂载载document
上- 真实
Dom
触发后冒泡到document
后才会对React
事件进行处理 - 所有原生事件先执行
- 然后执行
React
合成事件 - 最后执行真正在
document
上挂载的事件 - 原生事件中如果执行了
stopPropagation()
会导致其他React
事件失效,因为所有事件无法冒泡到document
上
React 模块热替换(HMR)
帮助你在浏览器中重新加载应用的工具,并且无需再让浏览器刷新页面。
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './index.css';
ReactDOM.render(
<App />,
document.getElementById('root')
);
// HMR
if (module.hot) {
module.hot.accept();
}
React 列表关键字 Key
React
可以在列表发生变化的时候识别其中成员的添加、更改和删除的状态。你应该确保这个关键字属性是一个稳定的标识符。不要错误地使用列表成员在数组的索引(index
)作为关键字。列表成员的索引是完全不稳定的。
React PorpTypes
强烈建议所有子组件声明PorpTypes
,尤其UI/业务组件库。
- 支持类型:
PropTypes.array
,bool
,func
,number
,object
,string
,(node
,element
:可渲染的片段(节点)。比如一段字符串,或者一个React
元素) - 必须参数:必须参数类型后加
.isRequired
,比如:PropTypes.func.isRequired
。 - 默认值:
defaultProps
。 - 你可以将数组
PropTypes
的元素定义的更加明确:
// 类型
Table.propTypes = {
list: PropTypes.arrayOf(
PropTypes.shape({
objectID: PropTypes.string.isRequired,
author: PropTypes.string,
url: PropTypes.string,
num_comments: PropTypes.number,
points: PropTypes.number,
})
).isRequired,
onDismiss: PropTypes.func.isRequired,
};
// 默认值
Table.defaultProps = {
className: '',
};
props 详解
https://www.robinwieruch.de/react-pass-props-to-component
子组件状态管理
子组件初始化状态来自父组件(props
)。props
改变以后,会触发子组件会重新渲染,但不会执行constructor
函数和componentDidMount
生命周期。状态管理可总结为两类:
props
完全自控:在constructor
函数读取props
建立自己的state
。onChange
的时候setState({})
重新渲染自身。同时调用父组件方法更新数据。适用多数组件,比如input
使用这种方式比较合理。props
非完全自控: 在render
函数直接根据props
渲染,onChange
的时候调用父组件方法更新父组件的state
, 然后父组件重新渲染触发子组件渲染。比如一个list
选择组件,initList
,checkedValue
,来自父组件,value
是可控的,可以本地state
管理,如果initList
是不可控的,取决于父组件,如果在父组件中是可能发生改变的,就没有办法本地管理,所以只能使用这种方式。