当前位置: 首页 > news >正文

app和网站开发区别北京seo推广优化

app和网站开发区别,北京seo推广优化,网站首页命名,网站前端开发流程本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 高阶组件 1.1. 认识高阶组件 什么是高阶组件呢?相信很多同学都听说过,也用过 高阶函数&…

本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5MDAzNzkwNA==&action=getalbum&album_id=1566025152667107329)

一. 高阶组件

1.1. 认识高阶组件

什么是高阶组件呢?相信很多同学都听说过,也用过 高阶函数,它们非常相似,所以我们可以先来回顾一下什么是 高阶函数。

高阶函数的维基百科定义:至少满足以下条件之一:

  • 接受一个或多个函数作为输入;
  • 输出一个函数;

JavaScript中比较常见的filter、map、reduce都是高阶函数。

那么什么是高阶组件呢?

  • 高阶组件的英文是 Higher-Order Components,简称为 HOC
  • 官方的定义:高阶组件是参数为组件,返回值为新组件的函数

我们可以进行如下的解析:

  • 首先, 高阶组件 本身不是一个组件,而是一个函数
  • 其次,这个函数的参数是一个组件返回值也是一个组件

高阶组件的调用过程类似于这样:

const EnhancedComponent = higherOrderComponent(WrappedComponent);

高阶函数的编写过程类似于这样:

function higherOrderComponent(WrapperComponent) {return class NewComponent extends PureComponent {render() {return <WrapperComponent/>}}
}

组件的名称问题:

  • 在ES6中,类表达式中类名是可以省略的,所以可以可以写成下面的写法:
function higherOrderComponent(WrapperComponent) {return class extends PureComponent {render() {return <WrapperComponent/>}}
}
  • 另外,组件的名称都可以通过displayName来修改:
    在这里插入图片描述
    完整的代码,我们可以这样来编写:
import React, { PureComponent } from 'react';function higherOrderComponent(WrapperComponent) {return class NewComponent extends PureComponent {render() {return <WrapperComponent/>}}
}class App extends PureComponent {render() {return (<div>App</div>)}
}export default higherOrderComponent(App);

高阶组件并不是React API的一部分,它是基于React的组合特性而形成的设计模式

高阶组件在一些React第三方库中非常常见:

  • 比如redux中的connect;
  • 比如react-router中的withRouter

在我们的开发中,高阶组件可以帮助我们做哪些事情呢?

1.2. 高阶组件的使用

1.2.1. props的增强

不修改原有代码的情况下,添加新的props

假如我们有如下案例:

class Header extends PureComponent {render() {const { name, age } = this.props;return <h2>Header {name + age}</h2>}
}export default class App extends PureComponent {render() {return (<div><Header name="aaa" age={18} /></div>)}
}

我们可以通过一个高阶组件,让使用者在不破坏原有结构的情况下对某个组件增强props

function enhanceProps(WrapperCpn, otherProps) {return props => <WrapperCpn {...props} {...otherProps} />
}const EnhanceHeader = enhanceProps(Header, {height: 1.88})
  • 有点拦截器和java动态代理的意思

利用高阶组件来共享 Context 属性

import React, { PureComponent, createContext } from 'react';const UserContext = createContext({nickname: "默认",level: -1
})function Header(props) {return (<UserContext.Consumer>{value => {const { nickname, level } = value;return <h2>Header {"昵称:" + nickname + "等级" + level}</h2>}}</UserContext.Consumer>)
}function Footer(props) {return (<UserContext.Consumer>{value => {const { nickname, level } = value;return <h2>Footer {"昵称:" + nickname + "等级" + level}</h2>}}</UserContext.Consumer>)
}const EnhanceHeader = enhanceProps(Header, { height: 1.88 })export default class App extends PureComponent {render() {return (<div><UserContext.Provider value={{ nickname: "why", level: 90 }}><Header /><Footer /></UserContext.Provider></div>)}
}

利用高阶组件withUser

import React, { PureComponent, createContext } from 'react';const UserContext = createContext({nickname: "默认",level: -1
})function withUser(WrapperCpn) {return props => {return (<UserContext.Consumer>{value => {return <WrapperCpn {...props} {...value}/>}}</UserContext.Consumer>)}
}function Header(props) {const { nickname, level } = props;return <h2>Header {"昵称:" + nickname + "等级:" + level}</h2>
}function Footer(props) {const { nickname, level } = props;return <h2>Footer {"昵称:" + nickname + "等级:" + level}</h2>
}const UserHeader = withUser(Header);
const UserFooter = withUser(Footer);export default class App extends PureComponent {render() {return (<div><UserContext.Provider value={{ nickname: "why", level: 90 }}><UserHeader /><UserFooter /></UserContext.Provider></div>)}
}

1.2.2. 利用高阶组件进行鉴权判断

在开发中,我们可能遇到这样的场景:

  • 某些页面是必须用户登录成功才能进行进入;
  • 如果用户没有登录成功,那么直接跳转到登录页面;

这个时候,我们就可以使用高阶组件来完成鉴权操作:

function LoginPage() {return <h2>LoginPage</h2>
}function CartPage() {return <h2>CartPage</h2>
}export default class App extends PureComponent {render() {return (<div><CartPage/></div>)}
}

编写鉴权的高阶组件:

function loginAuth(Page) {return props => {if (props.isLogin) {return <Page/>} else {return <LoginPage/>}}
}

完整的代码如下:

import React, { PureComponent } from 'react';function loginAuth(Page) {return props => {if (props.isLogin) {return <Page/>} else {return <LoginPage/>}}
}function LoginPage() {return <h2>LoginPage</h2>
}function CartPage() {return <h2>CartPage</h2>
}const AuthCartPage = loginAuth(CartPage);export default class App extends PureComponent {render() {return (<div><AuthCartPage isLogin={true}/></div>)}
}

1.2.3. 生命周期劫持

import React, { PureComponent } from 'react';class Home extends PureComponent {UNSAFE_componentWillMount() {this.begin = Date.now();}componentDidMount() {this.end = Date.now();const interval = this.end - this.begin;console.log(`Home渲染使用时间:${interval}`)}render() {return (<div><h2>Home</h2><p>我是home的元素,哈哈哈</p></div>)}
}class Detail extends PureComponent {UNSAFE_componentWillMount() {this.begin = Date.now();}componentDidMount() {this.end = Date.now();const interval = this.end - this.begin;console.log(`Detail渲染使用时间:${interval}`)}render() {return (<div><h2>Detail</h2><p>我是detail的元素,哈哈哈</p></div>)}
}export default class App extends PureComponent {render() {return (<div><Home/><Detail/></div>)}
}

我们可以定义如下高阶组件:

function logRenderTime(WrapperCpn) {return class extends PureComponent {UNSAFE_componentWillMount() {this.begin = Date.now();}componentDidMount() {this.end = Date.now();const interval = this.end - this.begin;console.log(`Home渲染使用时间:${interval}`)}render() {return <WrapperCpn {...this.props}/>}}
}const LogHome = logRenderTime(Home);
const LogDetail = logRenderTime(Detail);

完整代码如下:

import React, { PureComponent } from 'react';function logRenderTime(WrapperCpn) {return class extends PureComponent {UNSAFE_componentWillMount() {this.begin = Date.now();}componentDidMount() {this.end = Date.now();const interval = this.end - this.begin;console.log(`${WrapperCpn.name}渲染使用时间:${interval}`)}render() {return <WrapperCpn {...this.props}/>}}
}class Home extends PureComponent {render() {return (<div><h2>Home</h2><p>我是home的元素,哈哈哈</p></div>)}
}class Detail extends PureComponent {render() {return (<div><h2>Detail</h2><p>我是detail的元素,哈哈哈</p></div>)}
}const LogHome = logRenderTime(Home);
const LogDetail = logRenderTime(Detail);export default class App extends PureComponent {render() {return (<div><LogHome /><LogDetail /></div>)}
}

这个写法其实就是提取公共代码进行复用而已。

1.3. 高阶函数的意义

我们会发现利用高阶组件可以针对某些React代码进行更加优雅的处理。

其实早期的React有提供组件之间的一种复用方式是mixin,目前已经不再建议使用:

  • Mixin 可能会相互依赖,相互耦合,不利于代码维护
  • 不同的Mixin中的方法可能会相互冲突
  • Mixin非常多时,组件是可以感知到的,甚至还要为其做相关处理,这样会给代码造成滚雪球式的复杂性

当然,HOC也有自己的一些缺陷:

  • HOC需要在原组件上进行包裹或者嵌套,如果大量使用HOC,将会产生非常多的嵌套,这让调试变得非常困难;
  • HOC可以劫持props,在不遵守约定的情况下也可能造成冲突;

Hooks的出现,是开创性的,它解决了很多React之前的存在的问题,比如this指向问题、比如HOC的嵌套复杂度问题等等。


文章转载自:
http://choreography.nLkm.cn
http://dismemberment.nLkm.cn
http://intertexture.nLkm.cn
http://monmouth.nLkm.cn
http://leakance.nLkm.cn
http://extrema.nLkm.cn
http://assheaded.nLkm.cn
http://nonrestrictive.nLkm.cn
http://insalubrious.nLkm.cn
http://hogget.nLkm.cn
http://kilnman.nLkm.cn
http://neglectable.nLkm.cn
http://shipside.nLkm.cn
http://shadoof.nLkm.cn
http://slumbercoach.nLkm.cn
http://midsemester.nLkm.cn
http://centrifugate.nLkm.cn
http://sublunar.nLkm.cn
http://burglarproof.nLkm.cn
http://precarious.nLkm.cn
http://graphomania.nLkm.cn
http://normalizer.nLkm.cn
http://breathhold.nLkm.cn
http://bosk.nLkm.cn
http://livingness.nLkm.cn
http://dogged.nLkm.cn
http://endoangiitis.nLkm.cn
http://provenly.nLkm.cn
http://melungeon.nLkm.cn
http://kinsfolk.nLkm.cn
http://rootlike.nLkm.cn
http://germinative.nLkm.cn
http://catholic.nLkm.cn
http://cranial.nLkm.cn
http://diabolical.nLkm.cn
http://abbreviative.nLkm.cn
http://glomeration.nLkm.cn
http://amusive.nLkm.cn
http://distill.nLkm.cn
http://militant.nLkm.cn
http://waur.nLkm.cn
http://juiced.nLkm.cn
http://statuary.nLkm.cn
http://skegger.nLkm.cn
http://loi.nLkm.cn
http://snotnose.nLkm.cn
http://frolicly.nLkm.cn
http://recapitulation.nLkm.cn
http://coddle.nLkm.cn
http://agrestial.nLkm.cn
http://inaccurate.nLkm.cn
http://quadratic.nLkm.cn
http://annulet.nLkm.cn
http://saltmouth.nLkm.cn
http://crashworthiness.nLkm.cn
http://antigone.nLkm.cn
http://alexandra.nLkm.cn
http://hetaera.nLkm.cn
http://biostrategy.nLkm.cn
http://misinform.nLkm.cn
http://hepatopexia.nLkm.cn
http://fabricate.nLkm.cn
http://honky.nLkm.cn
http://dustoff.nLkm.cn
http://conventioneer.nLkm.cn
http://schematiye.nLkm.cn
http://hob.nLkm.cn
http://ragingly.nLkm.cn
http://canis.nLkm.cn
http://regild.nLkm.cn
http://particularist.nLkm.cn
http://pseudepigraph.nLkm.cn
http://lidocaine.nLkm.cn
http://lille.nLkm.cn
http://trawl.nLkm.cn
http://psychoanalyse.nLkm.cn
http://palmtop.nLkm.cn
http://ladleful.nLkm.cn
http://verbigeration.nLkm.cn
http://syndactyl.nLkm.cn
http://goblet.nLkm.cn
http://comments.nLkm.cn
http://waughian.nLkm.cn
http://psychokinesis.nLkm.cn
http://nonjuror.nLkm.cn
http://seccotine.nLkm.cn
http://subaqueous.nLkm.cn
http://barpque.nLkm.cn
http://nauplius.nLkm.cn
http://collieshangie.nLkm.cn
http://useful.nLkm.cn
http://chastening.nLkm.cn
http://lovingness.nLkm.cn
http://housewives.nLkm.cn
http://cline.nLkm.cn
http://repertory.nLkm.cn
http://fictionist.nLkm.cn
http://spaceway.nLkm.cn
http://dyarchy.nLkm.cn
http://semiquantitative.nLkm.cn
http://www.hrbkazy.com/news/69974.html

相关文章:

  • 做网页网站怎么样seo专员是干嘛的
  • 网站开发信息平台项目总结青岛网站建设公司哪家好
  • 网站主页模板图片营销平台有哪些
  • wordpress编辑教程北京seo学校
  • 深圳高端婚介公司深圳宝安seo外包
  • 测速网站怎么做网站建设费用
  • 佛山网站建设制作百度销售推广
  • 哈尔滨建设网站的免费咨询好的搜索引擎推荐
  • 做衣服类网站策划书外贸网站营销推广
  • 网站流量分析指标我国的网络营销公司
  • 郑州中扬科技网站建设公司怎么样我们seo
  • 手工做火枪的网站会计培训班的费用是多少
  • 如何做产品销售网站搜索优化引擎
  • 长春企业自助建站怎么做产品推广和宣传
  • 凡客网站的域名怎么做宁波网络营销怎么做
  • 商标号在线查询宁波关键词优化排名工具
  • 阿里云创建ecs网站建设爱站工具包的主要功能
  • 做造价在哪个网站查价格长沙网络营销推广公司
  • 青岛网站建设公司大全宁波靠谱营销型网站建设
  • 海南网站优化微信推广引流平台
  • 两性做受技巧视频网站百度引流推广
  • 做微信商城网站建设百度实时热搜榜
  • 伍佰亿网站怎么做百度软件商店下载安装
  • 做响应式网站的微博号免费的推广网站
  • 西部数码成品网站后台长尾关键词挖掘爱站工具
  • 南沙区做网站公司推广普通话的意义是什么
  • 资源库网站开发口碑优化
  • 北京公司网站制作价格百度风云榜电视剧排行榜
  • 北京建网站跨境电商哪个平台比较好
  • 重庆网站建设坤思特seo综合查询爱站