内容简介:用到的原因是因为公司最近要做一个钉钉oa系统,选的技术栈则是比较火热的react,开发中意思是:高阶组件是一个函数,它接受一个组件并返回一个新组件举个例子:chestnut::假设我们现在需要实现一个登陆注册功能,为了方便,我们把用户(user)存在
用到的原因是因为公司最近要做一个钉钉oa系统,选的技术栈则是比较火热的react,开发中 遇到的问题就是代码如何复用问题 ,因为react官方已经不推荐使用 Mixins ,而是推荐了 高阶组件 这种方式,接下来我们就来聊聊它
高阶组件的概念
a higher-order component is a function that takes a component and returns a new component.
意思是:高阶组件是一个函数,它接受一个组件并返回一个新组件
利用函数带你理解高阶组件
举个例子:chestnut::假设我们现在需要实现一个登陆注册功能,为了方便,我们把用户(user)存在 localStorage 下, 如果发生操作行为就会先去检测下有没有user (当然现实开发不可以这样做的) 代码实现:
// 登陆 function login() { let user = localStorage.getItem('user'); console.log('login ' + login); } // 注册 function resgister() { let user = localStorage.getItem('user'); console.log('resgister ' + user); } login(); resgister(); 复制代码
上面的例子我们发现都有一句一模一样的冗余代码,这显然对于有代码洁癖的人简直不能忍,那就动手将它抽离出来挨打吧
代码实现:
// 登陆 function login() { console.log('login ' + login); } // 注册 function resgister() { console.log('resgister ' + user); } // 抽离出来的中间函数 function wrapUser(Wrapfunc) { let Newfunc = () => { let user = localStorage.getItem('user'); Wrapfunc(user); }; return Newfunc; } // 调用 login = wrapUser(login); resgister = wrapUser(resgister); login(); resgister(); 复制代码
以上的例子我们可以把 wrapUser称为高阶函数 ,它负责的是就是把我们共用代码抽离的出来,这样简化了复用的代码,很多同学会问,上面的代码量不是更加多了吗?但是实际开发项目时候复用的代码可不是这么一丁点,还有可能有其他需求产生复用这段代码就比如产品临时加了 需要忘记密码的功能
代码如下:
function forgetPassWord(){ console.log('forgetPassWord ' + user); } forgetPassWord = wrapUser(forgetPassWord); forgetPassWord() 复制代码
从高阶函数来看高阶组件
上面的代码如果用react方式是怎么实现的
Login组件
import React, {Component} from 'react' class Login extends Component { constructor(props) { super(props); this.state = { user: '' } } componentWillMount() { let user = localStorage.getItem('user'); this.setState({ user }) } render() { return ( <div>login{this.state.user}</div> ) } } export default Login; 复制代码
Register组件
import React, {Component} from 'react' class Register extends Component { constructor(props) { super(props); this.state = { user: '' } } componentWillMount() { let user = localStorage.getItem('user'); this.setState({ user }) } render() { return ( <div>register{this.state.user}</div> ) } } export default Register; 复制代码
可以看到这个组件这两个组件都有复用的代码, 所以我们上述高阶函数wrapUser的例子来实现高阶组件
WrapUser高阶组件
import React, {Component} from 'react' export default (WrapComponent) => { // 这里的WrapComponent是我们传进来的组件 class NewComponent extends Component { constructor() { super(); this.state = { user: '' } } componentWillMount() { let user = localStorage.getItem('user'); this.setState({ user }) } render() { return <WrapComponent user={this.state.user}/> } } return NewComponent } 复制代码
上述的代码是声明一个函数这个函数从参数是接收一个组件,然后return回去一个新的组件,咋一看有同学发现这个很像是 父组件套了一个子组件 ,没错实际上就是这样的,而且他们的通信也是 父子组件通信
这样我们来简化下login组件和register组件
Login组件
import React, {Component} from 'react'; import WrapUser from 'WrapUser'; class Login extends Component { render() { return ( <div>login{this.props.user}</div> ) } } Login = WrapUser(Login); export default Login; 复制代码
Register组件
import React, {Component} from 'react'; import WrapUser from 'WrapUser'; class Register extends Component { render() { return ( <div>register{this.props.user}</div> ) } } Register = WrapUser(Register); export default Register; 复制代码
到这里我们代码复用性的问题就解决了,高阶组件实际就是一个函数,并不要被它的名称所吓倒
总结
- 高阶组件的目的就是为了解决代码复用性问题
- 高阶组件的通信是按照父子通信机制的
以上所述就是小编给大家介绍的《实际上你已经懂的react高阶组件》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。