文章的原文連接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 的新特性。