We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Mixin(混入)是一种通过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另一个对象上面去,可以拷贝多个属性到一个对象上,为了解决代码复用问题。
常用的方法:JQuery 的 extend 方法。
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>) } });
高阶组件的定义:
高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。 (高阶组件是参数为组件,返回值为新组件的函数。)
具体的意思就是: 高阶组件可以看作 React 对装饰模式的一种实现,高阶组件就是一个函数,且该函数接受一个组件作为参数,并返回一个新的组件。他会返回一个增强的 React 组件。高阶组件可以让我们的代码更具有复用性,逻辑性与抽象性,可以对 render 方法进行劫持,也可以控制 props 与 state。
const EnhancedComponent = higherOrderComponent(WrappedComponent);
实现高阶组件的两种方式:
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,这就是属性代理。
这样组件就可以一层层地作为参数被调用,原始组件就具备了高阶组件对它的修饰,也保持了单个组件的封装性,与易用性。
控制 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) 的技术进行共享。首先,你的一个组件定义了大量需要被渲染的标记,之后用若干具有你想用共享的行为的组件包裹它。因此,你现在是在 装饰 你的组件,而不是混入你需要的行为!
demos
Render Props 从名知义,也是一种剥离重复使用的逻辑代码,提升组件复用性的解决方案。在被复用的组件中,通过一个名为“render”(属性名也可以不是 render,只要值是一个函数即可)的属性,该属性是一个函数,这个函数接受一个对象并返回一个子组件,会将这个函数参数中的对象作为 props 传入给新生成的组件。
render prop
�### 小栗子
<DataProvider render={data => ( <h1>Hello {data.target}</h1> )}/>
render props demo
可以用 �render props来代替 HOC
render props
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)}>
动机
https://zh-hans.reactjs.org/docs/hooks-intro.html#motivation
�Hook 是的作用
我们写的有状态组件,通常会产生很多的副作用(side effect)。之前都把这些副作用的函数写在生命周期函数钩子里,比如 componentDidMount,componentDidUpdate 和 componentWillUnmount。而现在的 useEffect 就相当与这些声明周期函数钩子的集合体。它以一抵三。
用 Effect Hooks 来解决这个这些副作用。
只能在 React 函数式组件或自定义 Hook 中使用 Hook。
Hook 的提出主要就是为了解决 class 组件的一系列问题,所以我们不能在 class 组件中使用它。
相比函数,编写一个 class 可能需要掌握更多的知识,需要注意的点也越多,比如 this 指向、绑定事件等等。另外,计算机理解一个函数比理解一个 class 更快。Hooks 让你可以在 classes 之外使用更多 React 的新特性。
render props hooks
The text was updated successfully, but these errors were encountered:
No branches or pull requests
mixin
Mixin 设计模式
Mixin(混入)是一种通过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另一个对象上面去,可以拷贝多个属性到一个对象上,为了解决代码复用问题。
常用的方法:JQuery 的 extend 方法。
�� 缺点
高阶组件(HOC)
高阶组件的定义:
具体的意思就是:
高阶组件可以看作 React 对装饰模式的一种实现,高阶组件就是一个函数,且该函数接受一个组件作为参数,并返回一个新的组件。他会返回一个增强的 React 组件。高阶组件可以让我们的代码更具有复用性,逻辑性与抽象性,可以对 render 方法进行劫持,也可以控制 props 与 state。
实现高阶组件的两种方式:
属性代理
这里最重要的部分是render 方法中返回的 WrappedComponent 的 React 组件,这样就可以通过高阶组件来传递 props,这就是属性代理。
这样组件就可以一层层地作为参数被调用,原始组件就具备了高阶组件对它的修饰,也保持了单个组件的封装性,与易用性。
特点
控制 props
我们可以在 HOC 里面对 props 进行增删查改等操作
通过 refs� 使用引用
抽象 state
渲染劫持
高阶组件可以在 render 函数中做非常多的操作,从而控制原组件的渲染输出。只要改变了原组件的渲染,我们都将它称之为一种渲染劫持。
修改 props
反向继承
这里返回的组件继承了 WrappedComponent,因为被动地继承了 WrappedComponent,所有的调用都会反向。
注意事项
当我们应用 HOC 去增强另一个组件时,我们实际使用的组件已经不是原组件了,所以我们拿不到原组件的任何静态属性,我们可以在 HOC 的结尾手动拷贝他们
不要在 render 方法内创建高阶组件
不要改变原始组件(高阶组件就是一个没有副作用的纯函数。)
透传不相关的 props
解决的问题
存在的问题
在这个范式下,代码通过一个类似于 装饰器(decorator) 的技术进行共享。首先,你的一个组件定义了大量需要被渲染的标记,之后用若干具有你想用共享的行为的组件包裹它。因此,你现在是在 装饰 你的组件,而不是混入你需要的行为!
demos
Render props
它的特点
render prop
是一种模式,重点是 prop,而不是 render,任何被用于告知组件需要渲染什么内容的函数 prop 在技术上都可以被称为 “render prop”.�### 小栗子
优势
render props demo
可以用 �
render props
来代替 HOCHook
在 �Hooks 出现以前,我们总是纠结的问题:
componentDidMount 和 componentDidUpdate 需要做相同的事情
为了保证 this 的指向正确,我们经常这么写
动机
https://zh-hans.reactjs.org/docs/hooks-intro.html#motivation
�Hook 是的作用
State Hooks
Effect Hooks
我们写的有状态组件,通常会产生很多的副作用(side effect)。之前都把这些副作用的函数写在生命周期函数钩子里,比如 componentDidMount,componentDidUpdate 和 componentWillUnmount。而现在的 useEffect 就相当与这些声明周期函数钩子的集合体。它以一抵三。
用 Effect Hooks 来解决这个这些副作用。
注意点
使用范围
只能在 React 函数式组件或自定义 Hook 中使用 Hook。
Hook 的提出主要就是为了解决 class 组件的一系列问题,所以我们不能在 class 组件中使用它。
相比函数,编写一个 class 可能需要掌握更多的知识,需要注意的点也越多,比如 this 指向、绑定事件等等。另外,计算机理解一个函数比理解一个 class 更快。Hooks 让你可以在 classes 之外使用更多 React 的新特性。
render props hooks
The text was updated successfully, but these errors were encountered: