欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解從react轉(zhuǎn)職到vue開發(fā)的項(xiàng)目準(zhǔn)備

 更新時(shí)間:2019年01月14日 15:21:01   作者:yacan8  
這篇文章主要介紹了詳解從react轉(zhuǎn)職到vue開發(fā)的項(xiàng)目準(zhǔn)備,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

前言

首先,為什么我需要做這個(gè)項(xiàng)目準(zhǔn)備工作呢?因?yàn)槌D炅?xí)慣React開發(fā)的我,最近突然接手了一個(gè)Vue項(xiàng)目,而之前基本沒有過Vue的實(shí)踐,這么突兀讓還在沉溺于React開發(fā)的我進(jìn)行Vue開發(fā),甚是不習(xí)慣,那自然我需要想辦法讓Vue開發(fā)盡量與React相似,這樣大概讓自己在開發(fā)過程中更得心應(yīng)手吧。

組件開發(fā)

特性對比

眾所周知,Vue和React都有那么一個(gè)特性,那就是可以讓我們進(jìn)行組件化開發(fā),這樣可以讓代碼得到更好的重用以及解耦,在架構(gòu)定位中這個(gè)應(yīng)該叫縱向分層吧。但是,兩個(gè)框架開發(fā)組件的寫法都有所不同(這個(gè)不同是基于我的開發(fā)習(xí)慣),下面先看一下不同的地方。

首先是React,個(gè)人習(xí)慣于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: '點(diǎn)擊了按鈕'
  })
 }

 componentWillReveiveProps(nextProps) {
  console.log(`標(biāo)題從 ${this.props.title} 變?yōu)榱?${nextProps.title}`)
 }

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

下面是常見vue的寫法:

<template>
 <div>
  <h1>{{title}}</h1>
  <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(`標(biāo)題從 ${oldTile} 變?yōu)榱?${newTitle}`)
  }
 },
 data() {
  return {
   text: 'hello world'
  }
 },
 methods: {
  setText(e) {
   this.text = '點(diǎn)擊了按鈕';
  }
 }
}
</script>

這里的視圖渲染我們先忽略,下一節(jié)在詳細(xì)對比。

prop對比:

  • Vue的prop必須在props字段里聲明。React的prop不強(qiáng)制聲明,聲明時(shí)也可以使用prop-types對其聲明約束。
  • Vue的prop聲明過后掛在在組件的this下,需要的時(shí)候在this中獲取。React的prop存在組件的props字段中,使用的時(shí)候直接在this.props中獲取。

組件狀態(tài)對比,Vue為data,React為state:

  • Vue的狀態(tài)data需要在組件的data字段中以函數(shù)的方式聲明并返回一個(gè)對象。React的狀態(tài)state可以直接掛載在組件的state字段下,在使用之前初始化即可。
  • Vue的狀態(tài)data聲明后掛在在this下面,需要的是時(shí)候在this中獲取。React的狀態(tài)state存在組件的state字段中,使用的時(shí)候直接在this.state中獲取。
  • Vue的狀態(tài)更新可以直接對其進(jìn)行賦值,視圖可以直接得到同步。React的狀態(tài)更新必須使用setState,否則視圖不會更新。

然后是組件方法對比:

  • Vue的方法需要在methods字段下聲明。React的方法用方法的方式聲明在組件下即可。
  • Vue與React使用方法的方式相同,因?yàn)槎际菕燧d在組件中,直接在this中獲取即可。

計(jì)算屬性computed對比:

  • Vue有計(jì)算屬性在computed字段中聲明。React中無計(jì)算屬性特性,需要其他庫如mobx輔助完成。
  • Vue的計(jì)算屬性聲明后掛載在this下,需要的時(shí)候在this中獲取。

數(shù)據(jù)對比:

  • Vue中可以在watch字段中對prop、data、computed進(jìn)行對比,然后做相應(yīng)的操作。在React所有變化需要在聲明周期componentWillReveiveProps中手動將state和prop進(jìn)行對比。

對比完后發(fā)現(xiàn),其實(shí)Vue給我的個(gè)人感覺就是自己在寫配置,只不過配置是以函數(shù)的形式在寫,然后Vue幫你把這些配置好的東西掛載到組件下面。而且prop、data、computed、方法所有都是掛載組件下,其實(shí)單單從js語法上很難以理解,比如說我在computed中,想獲取data的text數(shù)據(jù),使用的是this.text來獲取,如果拋開vue,單單用js語法來看,其實(shí)this大多情況是指向computed對象的,所以個(gè)人覺得這樣的語法是反面向?qū)ο蟮摹?/p>

這個(gè)時(shí)候在反過來看React的class寫法,本來就是屬于面向?qū)ο蟮膶懛?,狀態(tài)state歸狀態(tài),屬性prop歸屬性,方法歸方法,想獲取什么內(nèi)容,通過this直接獲取,更接近于JavaScript編程,相對來說比較好理解。

組件改造

針對Vue的反面向?qū)ο?,我們可以更改其寫法,通過語法糖的形式,將其我們自己的寫法編譯成Vue需要的寫法。

vue-class-component

vue-class-component 是Vue英文官網(wǎng)推薦的一個(gè)包,可以以class的模式寫vue組件,它帶來了很多便利:

  • methods,鉤子都可以直接寫作class的方法
  • computed屬性可以直接通過get來獲得
  • 初始化data可以聲明為class的屬性
  • 其他的都可以放到Component裝飾器里

vue-property-decorator

vue-property-decorator 這個(gè)包完全依賴于vue-class-component,提供了多個(gè)裝飾器,輔助完成prop、watch、model等屬性的聲明。

編譯準(zhǔn)備

由于使用的是裝飾器語法糖,我們需要在我們webpack的babel編譯器中對齊進(jìn)行支持。

首先是class語法支持,針對babel6及更低的版本,需要配置babel的plugin中添加class語法支持插件babel-plugin-transform-class-properties,針對babel7,需要使用插件@babel/plugin-proposal-class-properties對class進(jìn)行語法轉(zhuǎn)換。

然后是裝飾器語法支持,針對babel6及更低的版本,需要配置babel的plugin中添加裝飾器語法支持插件babel-plugin-transform-decorators-legacy,針對babel7,需要使用插件@babel/plugin-proposal-decorators對裝飾器進(jìn)行語法轉(zhuǎn)換。

針對bable6,配置.babelrc如下

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

對于bable7,官方推薦直接使用@vue/apppreset,該預(yù)設(shè)包含了@babel/plugin-proposal-class-properties@babel/plugin-proposal-decorators兩個(gè)插件,另外還包含了動態(tài)分割加載chunks支持@babel/plugin-syntax-dynamic-import,同時(shí)也包含了@babel/envpreset,.babelrc配置如下:

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

重寫組件

編譯插件準(zhǔn)備好之后,我們對上面的Vue組件進(jìn)行改寫,代碼如下

<template>
 <div>
  <h1>{{title}}</h1>
  <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(`標(biāo)題從 ${oldTile} 變?yōu)榱?${newTitle}`)
 }

 setText(e) {
  this.text = '點(diǎn)擊了按鈕';
 }
}
</script>

到此為止,我們的組件改寫完畢,相對先前的“寫配置”的寫法,看起來相對來說要好理解一些吧。

注意:Vue的class的寫法的methods還是沒辦法使用箭頭函數(shù)進(jìn)行的,詳細(xì)原因這里就不展開,大概就是因?yàn)閂ue內(nèi)部掛載函數(shù)的方式的原因。

視圖開發(fā)

特性對比

針對視圖的開發(fā),Vue推崇html、js、css分離的寫法,React推崇all-in-js,所有都在js中進(jìn)行寫法。

當(dāng)然各有各的好處,如Vue將其進(jìn)行分離,代碼易讀性較好,但是在html中無法完美的展示JavaScript的編程能力,而對于React的jsx寫法,因?yàn)橛蠮avaScript的編程語法支持,讓我們更靈活的完成視圖開發(fā)。

對于這類不靈活的情況,Vue也對jsx進(jìn)行了支持,只需要在babel中添加插件babel-plugin-transform-vue-jsxbabel-plugin-syntax-jsx、babel-helper-vue-jsx-merge-props(babel6,對于babel7,官方推薦的@vue/app預(yù)設(shè)中已包含了jsx的轉(zhuǎn)化插件),我們就可以像React一樣,在組件中聲明render函數(shù)并返回jsx對象,如下我們對上一節(jié)的組件進(jìn)行改造:

組件改造

<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(`標(biāo)題從 ${oldTile} 變?yōu)榱?${newTitle}`)
 }

 setText(e) {
  this.text = '點(diǎn)擊了按鈕';
 }

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

Vue的jsx使用注意點(diǎn)

寫到這里,也基本上發(fā)現(xiàn)其寫法已經(jīng)與React的class寫法雷同了。那么Vue的jsx和React的jsx有什么不同呢。

在React的jsx語法需要React支持,也就是說,在你使用jsx的模塊中,必須引進(jìn)React。

而Vue的jsx語法需要Vue的createElement支持,也就是說在你的jsx語法的作用域當(dāng)中,必須存在變量h,變量h為createElement的別名,這是Vue生態(tài)系統(tǒng)中的一個(gè)通用慣例,在render中h變量由編譯器自動注入到作用域中,自動注入詳情見plugin-transform-vue-jsx,如果沒有變量h,需要從組件中獲取并聲明,代碼如下:

const h = this.$createElement;

這里借助官方的一個(gè)例子,基本包含了所有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的內(nèi)建指令,唯一的例外是v-show,該指令可以使用v-show={value}的語法。大多數(shù)指令都可以用編程方式實(shí)現(xiàn),比如v-if就是一個(gè)三元表達(dá)式,v-for就是一個(gè)array.map()等。

如果是自定義指令,可以使用v-name={value}語法,但是該語法不支持指令的參數(shù)arguments和修飾器modifier。有以下兩個(gè)解決方法:

  • 將所有內(nèi)容以一個(gè)對象傳入,如:v-name={{ value, modifier: true }}
  • 使用原生的vnode指令數(shù)據(jù)格式,如:
const directives = [
 { name: 'my-dir', value: 123, modifiers: { abc: true } }
]

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

那么,我們什么時(shí)候使用jsx,什么時(shí)候template呢?很明顯,面對那么復(fù)雜多變的視圖渲染,我們使用jsx語法更能得心應(yīng)手,面對簡單的視圖,我們使用template能開發(fā)得更快。

狀態(tài)管理

特性對比

針對狀態(tài)管理,Vue的Vuex和React的Redux很雷同,都是Flow數(shù)據(jù)流。

對于React來說,state需要通過mapStateToProps將state傳入到組件的props中,action需要通過mapDispatchToProps將action注入到組件的props中,然后在組件的props中獲取并執(zhí)行。

而在Vue中,store在組件的$store中,可以直接this.$store.dispatch(actionType)來分發(fā)action,屬性也可以通過mapState,或者mapGetter把state或者getter掛載到組件的computed下,更粗暴的可以直接this.$store.state或者this.$store.getter獲取,非常方便。

組件改造

我們?yōu)榱烁N切于es6的class寫法,更好的配合vue-class-component,我們需要通過其他的方式將store的數(shù)據(jù)注入到組件中。

vuex-class

vuex-class,這個(gè)包的出現(xiàn),就是為了更好的講Vuex與class方式的Vue組件連接起來。

如下,我們聲明一個(gè)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;
    } 
   }
  }
 }
})

針對這個(gè)store,我們改寫我們上一章節(jié)的組件

<template>
 <div>
  <h1>{{title}}</h1>
  <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(`標(biāo)題從 ${oldTile} 變?yōu)榱?${newTitle}`)
 }

 setText(e) {
  this.setTextAction('點(diǎn)擊了按鈕');
 }
}
</script>

這里可以發(fā)現(xiàn),store聲明了一個(gè)foo模塊,然后在使用的時(shí)候從store中取出了foo模塊,然后使用裝飾器的形式將state和action注入到組件中,我們就可以省去dispatch的代碼,讓語法糖幫我們dispatch。這樣的代碼,看起來更貼切與面向?qū)ο?。。。好吧,我承認(rèn)這個(gè)代碼越寫越像Java了。

然而,之前的我并不是使用Redux開發(fā)React的,而是Mobx,所以這種 dispatch -> action -> matation -> state 的形式對我來說也不是很爽,我還是更喜歡把狀態(tài)管理也以class的形式去編寫,這個(gè)時(shí)候我又找了另外一個(gè)包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;

這樣,我們的項(xiàng)目準(zhǔn)備基本上完畢了,把Vue組件和Vuex狀態(tài)管理以class的形式來編寫。大概是我覺得es5的寫法顯得不太優(yōu)雅吧,沒有es6的寫法那么高端。

結(jié)束

class語法和裝飾器decorators語法都是ES6的提案,都帶給了前端不一樣的編程體驗(yàn),大概也是前端的一個(gè)比較大的變化吧,我們應(yīng)該擁抱這樣的變化。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談vue路徑優(yōu)化之resolve

    淺談vue路徑優(yōu)化之resolve

    本篇文章主要介紹了淺談vue路徑優(yōu)化之resolve,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • vue新建項(xiàng)目并配置標(biāo)準(zhǔn)路由過程解析

    vue新建項(xiàng)目并配置標(biāo)準(zhǔn)路由過程解析

    這篇文章主要介紹了vue新建項(xiàng)目并配置標(biāo)準(zhǔn)路由過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 詳解Vue的組件中data選項(xiàng)為什么必須是函數(shù)

    詳解Vue的組件中data選項(xiàng)為什么必須是函數(shù)

    這篇文章主要給大家介紹了關(guān)于Vue的組件中data選項(xiàng)為什么必須是函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 解決vue $http的get和post請求跨域問題

    解決vue $http的get和post請求跨域問題

    這篇文章主要介紹了解決vue $http的get和post請求跨域問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • vue通過子組件修改父組件prop的多種實(shí)現(xiàn)方式

    vue通過子組件修改父組件prop的多種實(shí)現(xiàn)方式

    這篇文章主要介紹了vue通過子組件修改父組件prop的幾種實(shí)現(xiàn)方式,比較常用的方式是通過Prop單向傳遞的規(guī)則,需要的朋友可以參考下
    2021-09-09
  • Vue中keyup.enter和blur事件沖突的問題及解決

    Vue中keyup.enter和blur事件沖突的問題及解決

    這篇文章主要介紹了Vue中keyup.enter和blur事件沖突的問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue2/vue3路由權(quán)限管理的方法實(shí)例

    vue2/vue3路由權(quán)限管理的方法實(shí)例

    最近用vue框架做了個(gè)后臺管理項(xiàng)目,涉及權(quán)限,所以下面這篇文章主要給大家介紹了關(guān)于vue2/vue3路由權(quán)限管理的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 一篇文章帶你使用Typescript封裝一個(gè)Vue組件(簡單易懂)

    一篇文章帶你使用Typescript封裝一個(gè)Vue組件(簡單易懂)

    這篇文章主要介紹了使用Typescript封裝一個(gè)Vue組件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • create?vite?實(shí)例源碼解析

    create?vite?實(shí)例源碼解析

    這篇文章主要為大家介紹了create?vite?實(shí)例源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • vue中$set的使用(結(jié)合在實(shí)際應(yīng)用中遇到的坑)

    vue中$set的使用(結(jié)合在實(shí)際應(yīng)用中遇到的坑)

    這篇文章主要介紹了vue中$set的使用(結(jié)合在實(shí)際應(yīng)用中遇到的坑),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07

最新評論