3.状态提升、组合VS继承、事件处理

203 阅读2分钟

一.状态提升

1.为什么有状态提升

因为有单向数据流,我们知道,在 React 中,每个组件只关心它内部的状态,甚至组件无法知道自己是函数组件还是 class 组件。

所以我们的 state 为一个局部量,或者说是被封装起来的,它只对这个组件内部是有效的,在组件外面或者其他组件中不能直接使用这个组件的 state。

2.什么时候使用状态提升

我们可能在日常中遇到这样一个问题,两个组件需要共享数据,一起来完成某一项操作。那这个时候就可以使用到状态提升了。

我们知道,React 的数据是向下流动的,所以,我们可以把这些共享的数据放到这两个组件的共同父组件中,那这两个组件就都能使用这一数据了。这个思想,就称为状态提升( Lefting State Up )。

总结:状态提升的思想其实并不难。就是将子组件的 state 提升到父组件,然后这个父组件的任何子组件就都能使用这个 state,从而达到多个组件之间共享 state 的目的。

二.组合VS继承

1.包含

使用一个特殊的 children prop 来将他们的子组件传递到渲染结果中

function FancyBorder(props) {   ``return (     ``<div className={``'FancyBorder FancyBorder-' + props.color}>       ``{props.children}       ``</div>   ``); } <FancyBorder color=``"blue"``>       ``<h1 className=``"Dialog-title"``> Welcome</h1> </FancyBorder>

2.特例关系

把一些组件看作是其他组件的特殊实例

function Dialog(props) {   ``return (     ``<FancyBorder color=``"blue"``>       ``<h1 className=``"Dialog-title"``>         ``{props.title}            ``</h1>       ``<p className=``"Dialog-message"``>         ``{props.message}            ``</p>     ``</FancyBorder>   ``); }     <Dialog       ``title=``"Welcome"      ``message=``"Thank you for visiting our spacecraft!" />

类似于vue的slot插槽

目前并没有发现需要使用继承的地方。

三.事件处理

1.React事件处理VS原生Dom事件处理

React 事件绑定属性的命名采用驼峰式写法

如果采用 JSX 的语法你需要传入一个函数作为事件处理函数

另外在React当中,return false不会阻止事件的默认行为,需要调用 e.preventDefault();

2.绑定事件处理函数的this问题

bind和箭头函数