返回顶部
首页 > 资讯 > 前端开发 > html >如何从react转职到vue开发
  • 570
分享到

如何从react转职到vue开发

2024-04-02 19:04:59 570人浏览 薄情痞子
摘要

这篇文章主要介绍如何从React转职到Vue开发,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!组件开发特性对比众所周知,Vue和React都有那么一个特性,那就是可以让我们进行组件化

这篇文章主要介绍如何从React转职到Vue开发,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

组件开发

特性对比

众所周知,Vue和React都有那么一个特性,那就是可以让我们进行组件化开发,这样可以让代码得到更好的重用以及解耦,在架构定位中这个应该叫纵向分层吧。但是,两个框架开发组件的写法都有所不同(这个不同是基于我的开发习惯),下面先看一下不同的地方。

首先是React,个人习惯于es6的写法(从来没用过es5的createClass的写法):

import React, { Component } from 'react';
import propTypes from 'prop-types';

export default class Demo extends Component {

 state = {
  text: 'hello world'
 };

 static propTypes = {
  title: PropTypes.String
 }

 static defaultProps = {
  title: 'React Demo'
 }

 setText = e => {
  this.setState({
   text: '点击了按钮'
  })
 }

 componentWillReveiveProps(nextProps) {
  console.log(`标题从 ${this.props.title} 变为了 ${nextProps.title}`)
 }

 render() {
  const { title } = this.props;
  const { text } = this.state;
  return <div>
   <h2>{title}</h2>
   <span>{text}<span>
   <button onClick={this.setText}>按钮<button>
  </div>
 }
}

下面是常见vue的写法:

<template>
 <div>
  <h2>{{title}}</h2>
  <span>{{text}}<span>
  <button @click="setText">按钮</button>
 </div>
</template>

<script>
export default {
 props: {
  title: {
   type: String,
   default: 'Vue Demo'
  }
 },
 watch: {
  title(newTitle, oldTitle) {
   console.log(`标题从 ${oldTile} 变为了 ${newTitle}`)
  }
 },
 data() {
  return {
   text: 'hello world'
  }
 },
 methods: {
  setText(e) {
   this.text = '点击了按钮';
  }
 }
}
</script>

这里的视图渲染我们先忽略,下一节在详细对比。

prop对比:

  • Vue的prop必须在props字段里声明。React的prop不强制声明,声明时也可以使用prop-types对其声明约束。

  • Vue的prop声明过后挂在在组件的this下,需要的时候在this中获取。React的prop存在组件的props字段中,使用的时候直接在this.props中获取。

组件状态对比,Vue为data,React为state:

  • Vue的状态data需要在组件的data字段中以函数的方式声明并返回一个对象。React的状态state可以直接挂载在组件的state字段下,在使用之前初始化即可。

  • Vue的状态data声明后挂在在this下面,需要的是时候在this中获取。React的状态state存在组件的state字段中,使用的时候直接在this.state中获取。

  • Vue的状态更新可以直接对其进行赋值,视图可以直接得到同步。React的状态更新必须使用setState,否则视图不会更新。

然后是组件方法对比:

  • Vue的方法需要在methods字段下声明。React的方法用方法的方式声明在组件下即可。

  • Vue与React使用方法的方式相同,因为都是挂载在组件中,直接在this中获取即可。

计算属性computed对比:

  • Vue有计算属性在computed字段中声明。React中无计算属性特性,需要其他库如mobx辅助完成。

  • Vue的计算属性声明后挂载在this下,需要的时候在this中获取。

监听数据对比:

  • Vue中可以在watch字段中对prop、data、computed进行对比,然后做相应的操作。在React所有变化需要在声明周期componentWillReveiveProps中手动将state和prop进行对比。

对比完后发现,其实Vue给我的个人感觉就是自己在写配置,只不过配置是以函数的形式在写,然后Vue帮你把这些配置好的东西挂载到组件下面。而且prop、data、computed、方法所有都是挂载组件下,其实单单从js语法上很难以理解,比如说我在computed中,想获取data的text数据,使用的是this.text来获取,如果抛开vue,单单用js语法来看,其实this大多情况是指向computed对象的,所以个人觉得这样的语法是反面向对象的。

这个时候在反过来看React的class写法,本来就是属于面向对象的写法,状态state归状态,属性prop归属性,方法归方法,想获取什么内容,通过this直接获取,更接近于javascript编程,相对来说比较好理解。

组件改造

针对Vue的反面向对象,我们可以更改其写法,通过语法糖的形式,将其我们自己的写法编译成Vue需要的写法。

vue-class-component

vue-class-component 是Vue英文官网推荐的一个包,可以以class的模式写vue组件,它带来了很多便利:

  • methods,钩子都可以直接写作class的方法

  • computed属性可以直接通过get来获得

  • 初始化data可以声明为class的属性

  • 其他的都可以放到Component装饰器里

vue-property-decorator

vue-property-decorator 这个包完全依赖于vue-class-component,提供了多个装饰器,辅助完成prop、watch、model等属性的声明。

编译准备

由于使用的是装饰器语法糖,我们需要在我们webpack的babel编译器中对齐进行支持。

首先是class语法支持,针对babel6及更低的版本,需要配置babel的plugin中添加class语法支持插件babel-plugin-transfORM-class-properties,针对babel7,需要使用插件@babel/plugin-proposal-class-properties对class进行语法转换。

然后是装饰器语法支持,针对babel6及更低的版本,需要配置babel的plugin中添加装饰器语法支持插件babel-plugin-transform-decorators-legacy,针对babel7,需要使用插件@babel/plugin-proposal-decorators对装饰器进行语法转换。

针对bable6,配置.babelrc如下

{
  "presets": ["env", "stage-1"],
  "plugins": [
   "transform-runtime",
   "syntax-dynamic-import",
   "transform-class-properties", // 新增class语法支持
   "transform-decorators-legacy" // 新增装饰器语法支持
  ]
}

对于bable7,官方推荐直接使用@vue/apppreset,该预设包含了@babel/plugin-proposal-class-properties@babel/plugin-proposal-decorators两个插件,另外还包含了动态分割加载chunks支持@babel/plugin-syntax-dynamic-import,同时也包含了@babel/envpreset,.babelrc配置如下:

{
 "presets": [
   ["@vue/app", {
     "loose": true,
     "decoratorsLegacy": true
   }]
 ]
}

重写组件

编译插件准备好之后,我们对上面的Vue组件进行改写,代码如下

<template>
 <div>
  <h2>{{title}}</h2>
  <span>{{text}}<span>
  <button @click="setText">按钮</button>
 </div>
</template>

<script>
import { Vue, Component, Watch, Prop } from 'vue-property-decorator';

@Component
export default class Demo extends Vue {

 text = 'hello world';

 @Prop({type: String, default: 'Vue Demo'}) title;

 @Watch('title')
 titleChange(newTitle, oldTitle) {
  console.log(`标题从 ${oldTile} 变为了 ${newTitle}`)
 }

 setText(e) {
  this.text = '点击了按钮';
 }
}
</script>

到此为止,我们的组件改写完毕,相对先前的“写配置”的写法,看起来相对来说要好理解一些吧。

注意:Vue的class的写法的methods还是没办法使用箭头函数进行的,详细原因这里就不展开,大概就是因为Vue内部挂载函数的方式的原因。

视图开发

特性对比

针对视图的开发,Vue推崇html、js、CSS分离的写法,React推崇all-in-js,所有都在js中进行写法。

当然各有各的好处,如Vue将其进行分离,代码易读性较好,但是在html中无法完美的展示JavaScript的编程能力,而对于React的jsx写法,因为有JavaScript的编程语法支持,让我们更灵活的完成视图开发。

对于这类不灵活的情况,Vue也对jsx进行了支持,只需要在babel中添加插件babel-plugin-transform-vue-jsxbabel-plugin-syntax-jsxbabel-helper-vue-jsx-merge-props(babel6,对于babel7,官方推荐的@vue/app预设中已包含了jsx的转化插件),我们就可以像React一样,在组件中声明render函数并返回jsx对象,如下我们对上一节的组件进行改造:

组件改造

<script>
import { Vue, Component, Watch, Prop } from 'vue-property-decorator';

@Component
export default class Demo extends Vue {

 title = 'hello world';

 @Prop({type: String, default: 'Vue Demo'}) title;

 @Watch('title')
 titleChange(newTitle, oldTitle) {
  console.log(`标题从 ${oldTile} 变为了 ${newTitle}`)
 }

 setText(e) {
  this.text = '点击了按钮';
 }

 render() {
  const { title, text } = this;
  return <div>
   <h2>{title}</h2>
   <span>{text}<span>
   <button onClick={this.setText}>按钮<button>
  </div>
 }
}
</script>

Vue的jsx使用注意点

写到这里,也基本上发现其写法已经与React的class写法雷同了。那么Vue的jsx和React的jsx有什么不同呢。

在React的jsx语法需要React支持,也就是说,在你使用jsx的模块中,必须引进React。

而Vue的jsx语法需要Vue的createElement支持,也就是说在你的jsx语法的作用域当中,必须存在变量h,变量h为createElement的别名,这是Vue生态系统中的一个通用惯例,在render中h变量由编译器自动注入到作用域中,自动注入详情见plugin-transform-vue-jsx,如果没有变量h,需要从组件中获取并声明,代码如下:

const h = this.$createElement;

这里借助官方的一个例子,基本包含了所有Vue的jsx常用语法,如下:

// ...
render (h) {
 return (
  <div
   // normal attributes or component props.
   id="foo"
   // DOM properties are prefixed with `domProps`
   domPropsInnerHTML="bar"
   // event listeners are prefixed with `on` or `nativeOn`
   onClick={this.clickHandler}
   nativeOnClick={this.nativeClickHandler}
   // other special top-level properties
   class={{ foo: true, bar: false }}
   style={{ color: 'red', fontSize: '14px' }}
   key="key"
   ref="ref"
   // assign the `ref` is used on elements/components with v-for
   refInFor
   slot="slot">
  </div>
 )
}

但是,Vue的jsx语法无法支持Vue的内建指令,唯一的例外是v-show,该指令可以使用v-show={value}的语法。大多数指令都可以用编程方式实现,比如v-if就是一个三元表达式,v-for就是一个array.map()等。

如果是自定义指令,可以使用v-name={value}语法,但是该语法不支持指令的参数arguments和修饰器modifier。有以下两个解决方法:

  • 将所有内容以一个对象传入,如:v-name={{ value, modifier: true }}

  • 使用原生的vnode指令数据格式,如:

const directives = [
 { name: 'my-dir', value: 123, modifiers: { abc: true } }
]

return <div {...{ directives }}/>

那么,我们什么时候使用jsx,什么时候template呢?很明显,面对那么复杂多变的视图渲染,我们使用jsx语法更能得心应手,面对简单的视图,我们使用template能开发得更快。

状态管理

特性对比

针对状态管理,Vue的Vuex和React的Redux很雷同,都是Flow数据流。

对于React来说,state需要通过mapStateToProps将state传入到组件的props中,action需要通过mapDispatchToProps将action注入到组件的props中,然后在组件的props中获取并执行。

而在Vue中,store在组件的$store中,可以直接this.$store.dispatch(actionType)来分发action,属性也可以通过mapState,或者mapGetter把state或者getter挂载到组件的computed下,更粗暴的可以直接this.$store.state或者this.$store.getter获取,非常方便。

组件改造

我们为了更贴切于es6的class写法,更好的配合vue-class-component,我们需要通过其他的方式将store的数据注入到组件中。

vuex-class

vuex-class,这个包的出现,就是为了更好的讲Vuex与class方式的Vue组件连接起来。

如下,我们声明一个store

import Vuex from 'vuex';

const store = new Vuex.Store({
 modules: {
  foo: {
   namespaced: true,
   state: {
    text: 'hello world',
   },
   actions: {
    setTextAction: ({commit}, newText) => {
     commit('setText', newText);
    }
   },
   mutations: {
    setText: (state, newText) => {
     state.text = newText;
    } 
   }
  }
 }
})

针对这个store,我们改写我们上一章节的组件

<template>
 <div>
  <h2>{{title}}</h2>
  <span>{{text}}<span>
  <button @click="setText">按钮</button>
 </div>
</template>

<script>
import { Vue, Component, Watch, Prop } from 'vue-property-decorator';
import { namespace } from 'vuex-class';

const fooModule = namespace('foo');

@Component
export default class Demo extends Vue {

 @fooModule.State('text') text;
 @fooModule.Action('setTextAction') setTextAction;

 @Prop({type: String, default: 'Vue Demo'}) title;

 @Watch('title')
 titleChange(newTitle, oldTitle) {
  console.log(`标题从 ${oldTile} 变为了 ${newTitle}`)
 }

 setText(e) {
  this.setTextAction('点击了按钮');
 }
}
</script>

这里可以发现,store声明了一个foo模块,然后在使用的时候从store中取出了foo模块,然后使用装饰器的形式将state和action注入到组件中,我们就可以省去dispatch的代码,让语法糖帮我们dispatch。这样的代码,看起来更贴切与面向对象。。。好吧,我承认这个代码越写越像Java了。

然而,之前的我并不是使用Redux开发React的,而是Mobx,所以这种 dispatch -> action -> matation -> state 的形式对我来说也不是很爽,我还是更喜欢把状态管理也以class的形式去编写,这个时候我又找了另外一个包vuex-module-decorators来改写我的store.module。

下面我们改写上面的store:

import Vuex from 'vuex';
import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators';
 
@Module
class foo extends VuexModule {
 text = 'hello world'
 
 @Mutation
 setText(text) {
  this.text = text;
 }
 
 @Action({ commit: 'setText' })
 setTextAction(text) {
  return text;
 }
}

const store = new Vuex.Store({
 modules: {
  foo: foo
})
export default store;

这样,我们的项目准备基本上完毕了,把Vue组件和Vuex状态管理以class的形式来编写。大概是我觉得es5的写法显得不太优雅吧,没有es6的写法那么高端。

以上是“如何从react转职到vue开发”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网html频道!

--结束END--

本文标题: 如何从react转职到vue开发

本文链接: https://lsjlt.com/news/79285.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何从react转职到vue开发
    这篇文章主要介绍如何从react转职到vue开发,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!组件开发特性对比众所周知,Vue和React都有那么一个特性,那就是可以让我们进行组件化...
    99+
    2024-04-02
  • 我是如何从Android开发转framework开发的
    转framework开发快一年了,一直都想写一篇文章,分享一下自己的工作心得,也让做应用开发的小伙伴对framework开发有一定的了解,但因为种种原因耽搁了,今天就趁着工作闲暇之余,聊聊我从应用开发转framework开发的心路历程,自己...
    99+
    2023-08-16
    android
  • Vue插件如何实现从封装到发布
    这篇文章主要介绍Vue插件如何实现从封装到发布,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!插件的分类添加全局的方法或者属性 比如:vue-element添加全局的资源 比如:指令 ...
    99+
    2024-04-02
  • 从Java到Django:一个开发者的转换故事
    Java是一门广泛使用的编程语言,Java开发人员有很多,而Django则是Python语言的一种Web框架,越来越多的开发人员开始关注它。本文将分享一个开发者从Java到Django的转换故事。 Java是一门面向对象编程语言,最初由S...
    99+
    2023-11-12
    django http git
  • 从PHP后端到前端开发的转变之路
    从PHP后端到前端开发的转变之路 随着互联网技术的不断发展,前端开发在整个软件开发领域中的重要性日益凸显。许多从事PHP后端开发的工程师开始意识到学习前端开发的重要性,因此开始转变自己...
    99+
    2024-03-12
    前端 php 转变
  • react如何实现跳转到新页面
    今天小编给大家分享一下react如何实现跳转到新页面的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。react实现跳转到新页面...
    99+
    2023-07-04
  • CMS插件开发的职业发展之路:从初学者到资深专家的成长历程
    CMS插件开发作为一种备受欢迎的职业选择,为个人提供了广阔的发展空间。想要在该领域取得成功,需要从初学者逐步成长为资深专家,掌握必要的知识和技能。本文将详细介绍CMS插件开发的职业发展之路,帮助您实现从初学者到资深专家的成长蜕变。 1....
    99+
    2024-02-05
    CMS 插件开发 职业发展 初学者 资深专家
  • vscode中如何开发一个支持vue文件跳转到定义的插件
    本篇内容主要讲解“vscode中如何开发一个支持vue文件跳转到定义的插件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vscode中如何开发一个支持vue文件跳转到定义的插件”吧!插件vsco...
    99+
    2023-07-04
  • 【指南】VUE Progressive Web App开发的艺术:从零到精通
    Vue Progressive Web App (PWA)是一种利用现代网络技术构建的应用程序,它可以提供类似于原生应用的体验,同时具有跨平台、离线访问、快速加载等优点。如果你想学习如何使用Vue来构建PWA,那么这篇指南将为你提供从零到...
    99+
    2024-02-06
    前言:
  • JavaScript React 中的部署策略:从开发到生产的无缝过渡
    环境隔离: 维护具有不同配置的开发、暂存和生产环境。 使用环境变量来区分环境并加载特定配置。 实施持续集成 (CI) 管道,自动构建和测试代码更改。 代码管理: 使用版本控制系统(如 Git)来管理代码,允许跟踪更改并轻松回滚到早期...
    99+
    2024-04-02
  • 如何将域名从万网转到Godaddy
    这篇文章将为大家详细讲解有关如何将域名从万网转到Godaddy,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。09年年底,随着形势越来越严峻,之前所用的CPH的合租主机被停止了,在多方考虑之下...
    99+
    2023-06-12
  • 如何搭建React Native开发环境
    这篇文章主要为大家展示了“如何搭建React Native开发环境”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何搭建React Native开发环境”这篇文...
    99+
    2024-04-02
  • 如何使用Components开发React应用
    这篇文章主要讲解了“如何使用Components开发React应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Components开发React应用”吧!(1) 命令行 npx c...
    99+
    2023-06-04
  • 如何开发vue-dev-server
    本文小编为大家详细介绍“如何开发vue-dev-server”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何开发vue-dev-server”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue-dev-ser...
    99+
    2023-07-02
  • VUE移动端开发新手指南:从小白到高手,一步到位
    一、VUE移动端开发简介 VUE是⼀款轻量级的前端框架,具有简单易⽤、灵活性强、学习曲线短等优点,⾮常适合用于移动端开发。VUE移动端开发,就是在移动设备上应⽤VUE框架来构建⽤户界⾯和业务逻辑,实现移动端应⽤程序的功能。 二、VUE移...
    99+
    2024-02-27
    VUE、移动端开发、移动端开发步骤、VUE移动端开发优势、VUE移动端开发教程、VUE移动端开发常见问题
  • 从Unix到Laravel,再到Python:如何打造自己的全栈开发环境?
    全栈开发人员是现代软件开发团队中不可或缺的一部分。他们不仅能够编写前端代码,还能够处理后端逻辑和数据库管理。对于那些想成为全栈开发人员的人来说,打造一个完善的开发环境是至关重要的。在本文中,我们将介绍如何从Unix到Laravel,再到P...
    99+
    2023-11-01
    shell laravel unix
  • VUE 移动端开发:从理论到实践,助力移动端开发技能的提升
    1. Vue.js简介 Vue.js是一个用于构建用户界面的JavaScript框架,因其轻量级、易学易用的特点而受到广大开发者的青睐。Vue.js采用组件化开发模式,使得开发人员可以轻松地构建复杂的UI界面。同时,Vue.js提供了丰...
    99+
    2024-02-04
    Vue.js 移动端 React Native NativeScript Weex JS
  • 如何搭建Webpack+Babel+React开发环境
    这篇文章主要介绍了如何搭建Webpack+Babel+React开发环境,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.认识Webpack...
    99+
    2024-04-02
  • 如何搭建React+Ant Design开发环境
    这篇文章主要介绍如何搭建React+Ant Design开发环境,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!基础知识1.使用脚手架创建项目并启动1 安装脚手架:npm install -g&nb...
    99+
    2023-06-14
  • 如何使用create-react-app快速构建React开发环境
    这篇文章给大家分享的是有关如何使用create-react-app快速构建React开发环境的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。常用的脚手架react-boilerpl...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作