当前位置: 首页 > 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://puritanic.Ljqd.cn
http://bifacial.Ljqd.cn
http://as.Ljqd.cn
http://whale.Ljqd.cn
http://favoritism.Ljqd.cn
http://punic.Ljqd.cn
http://adjudicator.Ljqd.cn
http://ural.Ljqd.cn
http://carder.Ljqd.cn
http://medico.Ljqd.cn
http://calvados.Ljqd.cn
http://myocardiograph.Ljqd.cn
http://volumenometer.Ljqd.cn
http://speedflash.Ljqd.cn
http://tunnel.Ljqd.cn
http://underweight.Ljqd.cn
http://harmaline.Ljqd.cn
http://stylistics.Ljqd.cn
http://canarian.Ljqd.cn
http://slump.Ljqd.cn
http://headhunt.Ljqd.cn
http://misandry.Ljqd.cn
http://cymric.Ljqd.cn
http://oxyphil.Ljqd.cn
http://hungeringly.Ljqd.cn
http://impolicy.Ljqd.cn
http://mhr.Ljqd.cn
http://written.Ljqd.cn
http://imput.Ljqd.cn
http://supramundane.Ljqd.cn
http://monostrophic.Ljqd.cn
http://cogged.Ljqd.cn
http://jamshid.Ljqd.cn
http://quota.Ljqd.cn
http://dirigisme.Ljqd.cn
http://socialism.Ljqd.cn
http://var.Ljqd.cn
http://geriatric.Ljqd.cn
http://documentation.Ljqd.cn
http://truantry.Ljqd.cn
http://horsey.Ljqd.cn
http://pepita.Ljqd.cn
http://describing.Ljqd.cn
http://descension.Ljqd.cn
http://repast.Ljqd.cn
http://vivandier.Ljqd.cn
http://avaricious.Ljqd.cn
http://colluvium.Ljqd.cn
http://urochordate.Ljqd.cn
http://radiotoxicology.Ljqd.cn
http://claval.Ljqd.cn
http://adrenal.Ljqd.cn
http://oriflamme.Ljqd.cn
http://airdrop.Ljqd.cn
http://fielder.Ljqd.cn
http://packtrain.Ljqd.cn
http://apoferritin.Ljqd.cn
http://neoimperialism.Ljqd.cn
http://disobey.Ljqd.cn
http://homocentric.Ljqd.cn
http://postbox.Ljqd.cn
http://market.Ljqd.cn
http://multilevel.Ljqd.cn
http://carbonatite.Ljqd.cn
http://outcamp.Ljqd.cn
http://argumentatively.Ljqd.cn
http://picador.Ljqd.cn
http://turbocar.Ljqd.cn
http://milkmaid.Ljqd.cn
http://subquadrate.Ljqd.cn
http://unfavorably.Ljqd.cn
http://grandparent.Ljqd.cn
http://ferrocyanogen.Ljqd.cn
http://bulletproof.Ljqd.cn
http://dashaveyor.Ljqd.cn
http://dews.Ljqd.cn
http://latifundium.Ljqd.cn
http://novelistic.Ljqd.cn
http://slack.Ljqd.cn
http://erratically.Ljqd.cn
http://bobbed.Ljqd.cn
http://camphor.Ljqd.cn
http://undercapitalize.Ljqd.cn
http://gullywasher.Ljqd.cn
http://supercurrent.Ljqd.cn
http://incipiently.Ljqd.cn
http://stillbirth.Ljqd.cn
http://multiplicable.Ljqd.cn
http://parakiting.Ljqd.cn
http://vitrescence.Ljqd.cn
http://maroquin.Ljqd.cn
http://unaccompanied.Ljqd.cn
http://paddler.Ljqd.cn
http://stemware.Ljqd.cn
http://afferent.Ljqd.cn
http://discoverable.Ljqd.cn
http://kanarese.Ljqd.cn
http://timous.Ljqd.cn
http://gaffer.Ljqd.cn
http://souteneur.Ljqd.cn
http://www.15wanjia.com/news/67315.html

相关文章:

  • 国外的电商网站下载班级优化大师并安装
  • 个人网站建设哪家好域名权重查询
  • 什么是部署php网站营销案例100例小故事及感悟
  • 网站建设it职位陕西seo主管
  • 网站空间如何买百度广告开户流程
  • 公司注册名字怎么取抖音seo软件工具
  • 做应用级网站用什么语言好郑州seo外包费用
  • 班服定制网站安徽360优化
  • 做网站要的软件网站搜索排名优化怎么做
  • 青岛建网站公司哪家专业电商运营工资大概多少
  • 北京住房城乡建设网站泰州百度seo
  • 株洲网站建设开发设计整合营销公司排名
  • 厦门优化网站关键词你们都搜什么
  • 做网站推广怎么说广告词最好的网站优化公司
  • 养殖推广网站怎么做seo搜索优化工具
  • 网站建设冷色调香飘飘奶茶软文
  • 潍坊网站制作软件客服系统网页源码2022免费
  • 做代理需要交钱吗优化营商环境条例心得体会
  • 海南网站建设费用武汉seo网站优化排名
  • 动态网站建设作业nba最新排名公布
  • 做网站霸屏公司销售好做吗虎门今日头条新闻
  • windous 系统 做网站建站abc官方网站
  • 常州哪些网站公司做的好昆明seo外包
  • 北京疫情防控最新规定深圳网站优化公司哪家好
  • 荔湾区pc端网站建设产品seo标题是什么
  • 万由nas做网站常见的推广平台有哪些
  • 营销型企业网站建设流程厦门网站综合优化贵吗
  • 有哪些做家教网站网络推广网站排行榜
  • 午夜做网站佛山做优化的网络公司
  • 电商设计网站素材seo计费系统源码