文章的原文连接github.com/RachelRen/b…html
Mixin(混入)是一种经过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另外一个对象上面去,能够拷贝多个属性到一个对象上,为了解决代码复用问题。react
经常使用的方法:JQuery 的 extend 方法。git
var LogMixin = {
log: function() {
console.log('log');
},
componentDidMount: function() {
console.log('in');
},
componentWillUnmount: function() {
console.log('out');
}
};
var User = React.createClass({
mixins: [LogMixin],
render: function() {
return (<div>...</div>)
}
});
var Goods = React.createClass({
mixins: [LogMixin],
render: function() {
return (<div>...</div>)
}
});
复制代码
高阶组件的定义:github
高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而造成的设计模式。 (高阶组件是参数为组件,返回值为新组件的函数。)设计模式
具体的意思就是: 高阶组件能够看做 React 对装饰模式的一种实现,高阶组件就是一个函数,且该函数接受一个组件做为参数,并返回一个新的组件。他会返回一个加强的 React 组件。高阶组件可让咱们的代码更具备复用性,逻辑性与抽象性,能够对 render 方法进行劫持,也能够控制 props 与 state。bash
const EnhancedComponent = higherOrderComponent(WrappedComponent);
复制代码
实现高阶组件的两种方式:app
import React,{Component} from 'react';
const HOC = (WrappedComponent) =>
class WrapperComponent extends Component {
state = { number: 0 };
btnClick = () => {
this.setState({
number: this.state.number++
})
}
render() {
const newProps = {
btnClick: this.btnClick,
number: this.state.number
}
return (
<div>
rere HOC
<WrappedComponent {...this.props} {...this.newProps} />
</div>
)
}
}
export default HOC;
class MyComponent extends Component{
//...
}
export default HOC(MyComponent)
复制代码
这里最重要的部分是render 方法中返回的 WrappedComponent 的 React 组件,这样就能够经过高阶组件来传递 props,这就是属性代理。异步
这样组件就能够一层层地做为参数被调用,原始组件就具有了高阶组件对它的修饰,也保持了单个组件的封装性,与易用性。ide
控制 props 咱们能够在 HOC 里面对 props 进行增删查改等操做函数
const MouseHoc = (MouseComponent, props) => {
props.text = props.text + "---I can operate props";
return class extends React.Component {
render() {
return (
<div style={{ height: "100%" }} onMouseMove={this.handleMouseMove}>
<MouseComponent {...props} mouse={this.state} />
</div>
);
}
};
};
MouseHoc(Mouse, {
text: "some thing..."
});
复制代码
经过 refs 使用引用
function refHOC(WrappedComponent) {
return class extends Component {
componentDidMount() {
this.wapperRef.log();
}
render() {
return (
<WrappedComponent
{...this.props}
ref={ref => {
this.wapperRef = ref;
}}
/>
);
}
};
}
复制代码
抽象 state
渲染劫持 高阶组件能够在 render 函数中作很是多的操做,从而控制原组件的渲染输出。只要改变了原组件的渲染,咱们都将它称之为一种渲染劫持。
function visibleHOC(WrappedComponent) {
return class extends Component {
render() {
if (this.props.visible === false) return null;
return <WrappedComponent {...props} />;
}
};
}
复制代码
复制代码
const MyContainer = (WrappedComponent) =>
class extends WrappedComponent{
render(){
return super.render();
}
}
复制代码
这里返回的组件继承了 WrappedComponent,由于被动地继承了 WrappedComponent,全部的调用都会反向。
当咱们应用 HOC 去加强另外一个组件时,咱们实际使用的组件已经不是原组件了,因此咱们拿不到原组件的任何静态属性,咱们能够在 HOC 的结尾手动拷贝他们
function proxyHOC(WrappedComponent) {
class HOCComponent extends Component {
render() {
return <WrappedComponent {...this.props} />;
}
}
HOCComponent.staticMethod = WrappedComponent.staticMethod;
// ...
return HOCComponent;
}
复制代码
不要在 render 方法内建立高阶组件
不要改变原始组件(高阶组件就是一个没有反作用的纯函数。)
透传不相关的 props
在这个范式下,代码经过一个相似于 装饰器(decorator) 的技术进行共享。首先,你的一个组件定义了大量须要被渲染的标记,以后用若干具备你想用共享的行为的组件包裹它。所以,你如今是在 装饰 你的组件,而不是混入你须要的行为!
Render Props 从名知义,也是一种剥离重复使用的逻辑代码,提高组件复用性的解决方案。在被复用的组件中,经过一个名为“render”(属性名也能够不是 render,只要值是一个函数便可)的属性,该属性是一个函数,这个函数接受一个对象并返回一个子组件,会将这个函数参数中的对象做为 props 传入给新生成的组件。
render prop
是一种模式,重点是 prop,而不是 render,任何被用于告知组件须要渲染什么内容的函数 prop 在技术上均可以被称为 “render prop”.<DataProvider render={data => (
<h1>Hello {data.target}</h1>
)}/>
复制代码
能够用 render props
来代替 HOC
const withMouse = (Component) => {
return class extends React.Component {
render() {
return <Mouse render={mouse => (
<Component {...this.props} mouse={mouse}/>
)}/>
}
}
}
复制代码
在 Hooks 出现之前,咱们老是纠结的问题:
this.handleClick = this.handleClick.bind(this)
<button onClick={() => this.handleClick(e)}>
复制代码
动机
zh-hans.reactjs.org/docs/hooks-…
Hook 是的做用
咱们写的有状态组件,一般会产生不少的反作用(side effect)。以前都把这些反作用的函数写在生命周期函数钩子里,好比 componentDidMount,componentDidUpdate 和 componentWillUnmount。而如今的 useEffect 就至关与这些声明周期函数钩子的集合体。它以一抵三。
用 Effect Hooks 来解决这个这些反作用。
只能在 React 函数式组件或自定义 Hook 中使用 Hook。
Hook 的提出主要就是为了解决 class 组件的一系列问题,因此咱们不能在 class 组件中使用它。
相比函数,编写一个 class 可能须要掌握更多的知识,须要注意的点也越多,好比 this 指向、绑定事件等等。另外,计算机理解一个函数比理解一个 class 更快。Hooks 让你能够在 classes 以外使用更多 React 的新特性。