精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

五種在 Vue 3 中定義組件的方法

開(kāi)發(fā) 前端
Vue 正在不斷發(fā)展,目前,在Vue 3 中有多種定義組件的方法。從選項(xiàng)到組合再到類(lèi) API,情況大不相同,如果您剛剛開(kāi)始,可能會(huì)感到困惑。讓我們定義一個(gè)簡(jiǎn)單的組件并使用所有可用的方法重構(gòu)它。

Vue 正在不斷發(fā)展,目前,在Vue 3  中有多種定義組件的方法。從選項(xiàng)到組合再到類(lèi) API,情況大不相同,如果您剛剛開(kāi)始,可能會(huì)感到困惑。讓我們定義一個(gè)簡(jiǎn)單的組件并使用所有可用的方法重構(gòu)它。

1.  Options API

這是在 Vue 中聲明組件的最常見(jiàn)方式。從版本 1 開(kāi)始可用,您很可能已經(jīng)熟悉它。一切都在對(duì)象內(nèi)聲明,數(shù)據(jù)在幕后由 Vue 響應(yīng)。它不是那么靈活,因?yàn)樗褂?mixin 來(lái)共享行為。

<script>
import TheComponent from './components/TheComponent.vue'
import componentMixin from './mixins/componentMixin.js'


export default {
  name: 'OptionsAPI',
  components: {
    TheComponent,
    AsyncComponent: () => import('./components/AsyncComponent.vue'),
  },
  mixins: [componentMixin],
  props: {
    elements: {
      type: Array,
    },
    counter: {
      type: Number,
      default: 0,
    },
  },
  data() {
    return {
      object: {
        variable: true,
      },
    }
  },
  computed: {
    isEmpty() {
      return this.counter === 0
    },
  },
  watch: {
    counter() {
      console.log('Counter value changed')
    },
  },
  created() {
    console.log('Created hook called')
  },
  mounted() {
    console.log('Mounted hook called')
  },
  methods: {
    getParam(param) {
      return param
    },
    emitEvent() {
      this.$emit('event-name')
    },
  },
}
</script>
<template>
  <div class="wrapper">
    <TheComponent />
    <AsyncComponent v-if="object.variable" />
    <div class="static-class-name" :class="{ 'dynamic-class-name': object.variable }">
      Dynamic attributes example
    </div>
    <button @click="emitEvent">Emit event</button>
  </div>
</template>


<style lang="scss" scoped>
.wrapper {
  font-size: 20px;
}
</style>

2.Composition API

經(jīng)過(guò)多次討論、來(lái)自社區(qū)的反饋,以及令人驚訝的是,在這個(gè) RFC 中,有很多戲劇性的內(nèi)容,在 Vue 3 中引入了 Composition API。 目的是提供更靈活的 API 和更好的 TypeScript 支持。這種方法在很大程度上依賴(lài)于設(shè)置生命周期掛鉤。

<script>
import {
  ref,
  reactive,
  defineComponent,
  computed,
  watch,
} from 'vue'


import useMixin from './mixins/componentMixin.js'
import TheComponent from './components/TheComponent.vue'


export default defineComponent({
  name: 'CompositionAPI',
  components: {
    TheComponent,
    AsyncComponent: () => import('./components/AsyncComponent.vue'),
  },
  props: {
    elements: Array,
    counter: {
      type: Number,
      default: 0,
    },
  },
  setup(props, { emit }) {
    console.log('Equivalent to created hook')


    const enabled = ref(true)
    const object = reactive({ variable: false })


    const { mixinData, mixinMethod } = useMixin()


    const isEmpty = computed(() => {
      return props.counter === 0
    })


    watch(
      () => props.counter,
      () => {
        console.log('Counter value changed')
      }
    )


    function emitEvent() {
      emit('event-name')
    }
    function getParam(param) {
      return param
    }


    return {
      object,
      getParam,
      emitEvent,
      isEmpty
    }
  },
  mounted() {
    console.log('Mounted hook called')
  },
})
</script>


<template>
  <div class="wrapper">
    <TheComponent />
    <AsyncComponent v-if="object.variable" />
    <div class="static-class-name" :class="{ 'dynamic-class-name': object.variable }">
      Dynamic attributes example
    </div>
    <button @click="emitEvent">Emit event</button>
  </div>
</template>


<style scoped>
.wrapper {
  font-size: 20px;
}
</style>

如您所知,使用這種混合方法需要大量樣板代碼,而且設(shè)置函數(shù)很快就會(huì)失控。在遷移到 Vue 3 時(shí),這可能是一個(gè)很好的中間步驟,但是語(yǔ)法糖可以讓一切變得更干凈。

3.Script setup

在 Vue 3.2 中引入了一種更簡(jiǎn)潔的語(yǔ)法。通過(guò)在腳本元素中添加設(shè)置屬性,腳本部分中的所有內(nèi)容都會(huì)自動(dòng)暴露給模板。通過(guò)這種方式可以刪除很多樣板文件。

<script setup>
import {
  ref,
  reactive,
  defineAsyncComponent,
  computed,
  watch,
  onMounted,
} from "vue";


import useMixin from "./mixins/componentMixin.js";
import TheComponent from "./components/TheComponent.vue";
const AsyncComponent = defineAsyncComponent(() =>
  import("./components/AsyncComponent.vue")
);


console.log("Equivalent to created hook");
onMounted(() => {
  console.log("Mounted hook called");
});


const enabled = ref(true);
const object = reactive({ variable: false });


const props = defineProps({
  elements: Array,
  counter: {
    type: Number,
    default: 0,
  },
});


const { mixinData, mixinMethod } = useMixin();


const isEmpty = computed(() => {
  return props.counter === 0;
});


watch(() => props.counter, () => {
  console.log("Counter value changed");
});


const emit = defineEmits(["event-name"]);
function emitEvent() {
  emit("event-name");
}
function getParam(param) {
  return param;
}
</script>


<script>
export default {
  name: "ComponentVue3",
};
</script>


<template>
  <div class="wrapper">
    <TheComponent />
    <AsyncComponent v-if="object.variable" />
    <div
      class="static-class-name"
      :class="{ 'dynamic-class-name': object.variable }"
    >
      Dynamic attributes example
    </div>
    <button @click="emitEvent">Emit event</button>
  </div>
</template>


<style scoped>
.wrapper {
  font-size: 20px;
}
</style>

4. Reactivity Transform

這是非常有爭(zhēng)議的,被刪除了!這使得腳本設(shè)置成為本文的明確答案。(26/1/2023 更新)

以下代碼段中演示的腳本設(shè)置存在問(wèn)題。

<script setup>
import { ref, computed } from 'vue'


const counter = ref(0)
counter.value++


function increase() {
  counter.value++
}


const double = computed(() => {
  return counter.value * 2
})
</script>




<template>
  <div class="wrapper">
    <button @click="increase">Increase</button>
    {{ counter }}
    {{ double }}
  </div>
</template>

正如您所注意到的,使用 .value 訪問(wèn)反應(yīng)式計(jì)數(shù)器感覺(jué)不自然,并且是混淆和錯(cuò)誤輸入的常見(jiàn)來(lái)源。 

有一個(gè)實(shí)驗(yàn)性解決方案利用編譯時(shí)轉(zhuǎn)換來(lái)解決此問(wèn)題。反應(yīng)性轉(zhuǎn)換是一個(gè)可選的內(nèi)置步驟,它會(huì)自動(dòng)添加此后綴并使代碼看起來(lái)更清晰。

<scr
ipt setup>
import { computed } from 'vue'
let counter = $ref(0)
counter++
function increase() {
  counter++
}
const double = computed(() => {
return counter * 2
})
</script>
<template>
<div class="wrapper">
<button @click="increase">Increase</button>
    {{ counter }}
    {{ double }}
</div>
</template>

$ref 需要一個(gè)構(gòu)建步驟,但在訪問(wèn)變量時(shí)刪除了 .value 的必要性。啟用后它在全球范圍內(nèi)可用。

5.Class API

Class API 已經(jīng)可用很長(zhǎng)時(shí)間了。通常與 Typescript 搭配使用是 Vue 2 的可靠選擇,并且被認(rèn)真考慮為默認(rèn)的 Vue 3 語(yǔ)法。 

但經(jīng)過(guò)多次長(zhǎng)時(shí)間的討論后,它被放棄了,取而代之的是 Composition API。 

它在 Vue 3 中可用,但工具嚴(yán)重缺乏,官方建議遠(yuǎn)離它。無(wú)論如何,如果您真的喜歡使用類(lèi),您的組件將看起來(lái)像這樣。

<script lang="ts">
import { Options, Vue } from 'vue-class-component';


import AnotherComponent from './components/AnotherComponent.vue'  


@Options({
  components: {
    AnotherComponent
  }
})
export default class Counter extends Vue {
  counter = 0;


  get double(): number {
    return this.counter * 2;
  }
  increase(): void {
    this.quantity++;
  }
}
</script>




<template>
  <div class="wrapper">
    <button @click="increase">Increase</button>
    {{ counter }}
    {{ double }}
  </div>
</template>

結(jié)論

那哪個(gè)最好呢?這取決于典型的反應(yīng),盡管在這種情況下并非如此。從 Vue 2 遷移時(shí),選項(xiàng)和類(lèi) API 可以用作中間步驟,但它們不應(yīng)該是您的首選。 

如果您沒(méi)有構(gòu)建階段,則組合 API 設(shè)置是唯一的選擇,但由于大多數(shù)項(xiàng)目都是使用 Webpack 或 Vite 生成的,因此使用腳本設(shè)置既是可能的,也是鼓勵(lì)的,因?yàn)榇蠖鄶?shù)可訪問(wèn)的文檔都使用這種方法。

責(zé)任編輯:華軒 來(lái)源: web前端開(kāi)發(fā)
相關(guān)推薦

2023-11-21 15:23:15

JavaScript工具

2021-09-29 11:33:19

異步組件Vue 3

2023-06-02 15:42:51

JavaScript數(shù)據(jù)結(jié)構(gòu)對(duì)象

2020-07-24 20:45:51

Spark數(shù)據(jù)集函數(shù)

2020-03-25 18:23:07

Vue2Vue3組件

2024-08-07 10:16:00

2017-06-30 08:51:12

組件模板勒索軟件項(xiàng)目管理

2021-08-27 14:03:05

遠(yuǎn)程團(tuán)隊(duì)溝通遠(yuǎn)程通信

2023-07-04 15:11:30

TypeScript類(lèi)型保護(hù)

2018-12-19 19:30:46

JavaScript創(chuàng)建對(duì)象前端

2021-11-02 07:54:40

List分片Java

2023-05-09 15:01:43

JavaScript編程語(yǔ)言異常處理

2019-08-14 10:00:08

vue組件通信前端

2023-10-11 09:00:00

2017-07-03 16:03:49

IT技術(shù)周刊

2019-02-13 14:55:22

Windows 10視頻刪除聲音

2022-09-20 12:21:25

Vue2Vue3$attrs

2023-04-19 15:29:53

通信技巧Vue 3開(kāi)發(fā)

2022-05-06 08:47:10

Vue 3組件前端

2022-08-01 11:41:00

Vue插件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

91国产精品视频在线| 777久久久精品| 欧美在线视频二区| 亚洲性在线观看| 国产一区激情| 亚洲偷熟乱区亚洲香蕉av| 奇米影视四色在线| 538在线视频| 欧美国产一区视频在线观看| 亚洲精品欧美日韩专区| 国产成人免费观看视频| 欧美成人自拍| 日韩经典一区二区三区| 午夜视频在线网站| av电影在线地址| 中文字幕日韩av资源站| 国产自产在线视频一区| 91超薄丝袜肉丝一区二区| 在线成人黄色| 自拍亚洲一区欧美另类| 黄色片视频免费观看| 精品国产不卡一区二区| 欧美亚洲国产bt| 精品视频在线观看一区| 黄色免费在线观看网站| 国产日韩欧美电影| 精品亚洲第一| 高清国产mv在线观看| 精品伊人久久久久7777人| 日本精品va在线观看| 国产一级淫片免费| 久久精品亚洲人成影院| 国产亚洲日本欧美韩国| 丝袜美腿中文字幕| 国产成人精品福利| 91精品国产色综合久久不卡蜜臀 | 欧美日韩中字一区| 无码播放一区二区三区| 日本不卡影院| 亚洲丝袜制服诱惑| 亚洲一区影院| 九色视频成人自拍| 久久先锋影音av鲁色资源网| 国精产品一区二区| 懂色av蜜臀av粉嫩av分享吧| 国产一区啦啦啦在线观看| 国产精品香蕉在线观看| 最新国产中文字幕| 久久久一二三| 国产精品成av人在线视午夜片| 日韩xxx高潮hd| 亚洲国产日本| 国产69精品久久久久9| 动漫性做爰视频| 欧美日韩国产高清| 欧美高清视频一区二区| 国产精品第九页| 999亚洲国产精| 国产精品加勒比| 台湾佬美性中文| 国产一区二区三区精品在线观看 | 久久精品视频99| 在线视频这里只有精品| 日韩成人精品一区| 久久精品男人天堂| 国产一级理论片| 在线视频日韩| 国产成人精品一区| 国产一区二区在线播放视频| 九色|91porny| 波多野结衣成人在线| www.久久成人| 99re热视频精品| 亚洲成人自拍视频| 超碰在线网址| 午夜伦欧美伦电影理论片| 欧美成人高潮一二区在线看| 中文日产幕无线码一区二区| 在线免费一区三区| 四川一级毛毛片| 欧美做受69| 色噜噜狠狠色综合网图区| 黑鬼狂亚洲人videos| 海角社区69精品视频| 欧美综合一区第一页| 成人黄色免费网| 国产高清不卡一区| 久久99精品国产99久久| 91ph在线| 亚洲第一激情av| 别急慢慢来1978如如2| 国产精久久久| 日韩精品在线观| 天天鲁一鲁摸一摸爽一爽| 91久久亚洲| 国产精品欧美一区二区| 亚洲国产精品久久久久久6q| 91蜜桃免费观看视频| 国产大尺度在线观看| 爱啪视频在线观看视频免费| 欧美视频中文字幕| 人妖粗暴刺激videos呻吟| 精品国产乱码| 久久久在线视频| 中文字幕第31页| 成人h动漫精品一区二区| 亚洲精品在线免费看| 岛国片av在线| 欧美一区二区三区免费在线看 | 日韩mv欧美mv国产网站| 精品国模在线视频| www.国产一区二区| 国产成人在线视频网站| 亚洲v国产v在线观看| 丁香花在线影院| 91精品婷婷国产综合久久性色| 欧美丰满少妇人妻精品| 欧美激情1区2区| 国产精品主播视频| 成人亚洲性情网站www在线观看| 亚洲高清视频中文字幕| 污网站在线免费| 国产亚洲欧美日韩在线观看一区二区 | 四季久久免费一区二区三区四区| 91国在线观看| 人妻熟女aⅴ一区二区三区汇编| 91精品一区国产高清在线gif| 日本精品视频在线播放| 无码国精品一区二区免费蜜桃| 亚洲私人黄色宅男| 五月天激情播播| 欧美一区二区性| 国产成人精品优优av| 神马久久精品| 婷婷开心久久网| 深田咏美中文字幕| 红桃视频国产精品| 国产精品国产精品国产专区不卡| 日本理论片午伦夜理片在线观看| 91 com成人网| 欧美丰满艳妇bbwbbw| 国产一区二区三区精品视频| 艳色歌舞团一区二区三区| 一根才成人网| 亚洲视频在线看| 天堂网视频在线| 国产亚洲欧美一级| 亚洲天堂av线| 97视频热人人精品免费| 国产日韩av高清| 欧美激情视频在线播放| 欧美精品精品一区| 欧美精品成人久久| 粉嫩aⅴ一区二区三区四区五区| 乱子伦一区二区| 亚洲成人黄色| 91禁国产网站| 美女毛片在线看| 欧美亚洲日本一区| √天堂中文官网8在线| 国产精品亚洲人在线观看| 黑人巨大国产9丨视频| 9999精品视频| 欧美激情性做爰免费视频| 东京干手机福利视频| 欧美日韩亚洲精品内裤| 中文字幕第20页| 老司机免费视频一区二区三区| 一区二区三区四区| 日本免费一区二区三区视频| 久久久亚洲成人| 欧美男男激情freegay| 精品视频在线免费观看| 男人操女人的视频网站| 成人性色生活片| 久久久久人妻精品一区三寸| 凹凸成人精品亚洲精品密奴| 91精品国产自产在线观看永久| 成人黄色在线电影| 日韩黄色av网站| 国产又粗又黄又爽的视频| 一区二区在线看| 人妻精品久久久久中文字幕| 久久成人18免费观看| 日本久久久网站| 自拍自偷一区二区三区| 成人激情视频在线观看| 国产高清视频色在线www| 尤物九九久久国产精品的特点| 国产精品人人妻人人爽| 午夜精品久久久久久| 内射毛片内射国产夫妻| 国产sm精品调教视频网站| 玩弄japan白嫩少妇hd| 影音先锋日韩在线| 玛丽玛丽电影原版免费观看1977 | 久久亚洲午夜电影| 亚洲欧美在线综合| 欧美做受高潮电影o| 国产成人午夜| 国产亚洲欧美日韩美女| 狠狠综合久久av一区二区| 欧美亚洲禁片免费| 日韩成人免费观看| 亚洲日本va在线观看| free性中国hd国语露脸| 国模少妇一区二区三区| www一区二区www免费| 亚洲女同另类| 亚洲图片都市激情| 丝袜连裤袜欧美激情日韩| 成人免费视频在线观看超级碰| 亚洲精品**中文毛片| 色在人av网站天堂精品| 欧美性videos| 一区二区三区在线播放欧美| 色窝窝无码一区二区三区| 日韩一区二区电影在线| 中文字幕在线播放av| 福利精品视频在线| 久久久精品国产sm调教| 亚洲免费观看在线观看| 国产又粗又长免费视频| 久久这里都是精品| 免费观看黄网站| 久久99精品久久久久久国产越南| 国产一区亚洲二区三区| 亚洲国产日本| 欧美视频在线观看视频| 欧美色一级片| 国产小视频免费| 亚洲女同一区| 天堂av免费看| 欧美在线免费| 欧美 国产 精品| 91精品国产乱码久久久久久 | 91黄在线观看| 精品国产第一国产综合精品| 国产综合福利在线| 亚洲欧美在线综合| 成人h猎奇视频网站| 四虎影视成人精品国库在线观看| 国产精品白嫩初高中害羞小美女| www.成人影院| 国产成人精品综合| 亚洲www啪成人一区二区| 国产91在线高潮白浆在线观看| 天堂av中文在线观看| 欧美中文字幕精品| 高清成人在线| 国产在线视频91| 粉嫩av国产一区二区三区| 3d动漫啪啪精品一区二区免费| 欧洲精品99毛片免费高清观看| 91精品国产一区二区三区动漫| 欧美日韩黄色| 国产三级精品在线不卡| 性欧美lx╳lx╳| 日韩高清在线播放| 天天射—综合中文网| 亚洲一区 在线播放| 激情成人亚洲| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 色播五月激情五月| 韩国精品久久久| 26uuu国产| 91色乱码一区二区三区| 真实乱视频国产免费观看| 中文字幕一区二区三区在线不卡| 久草福利资源在线| 亚洲亚洲人成综合网络| 五月天婷婷久久| 欧美自拍偷拍午夜视频| 国产精品美女一区| 亚洲国产精品中文| 国产在线观看黄| 欧美伦理91i| 亚洲少妇视频| 成人久久精品视频| 红杏aⅴ成人免费视频| 欧美日韩一区二区三区在线观看免| 成人3d精品动漫精品一二三| 无颜之月在线看| 另类av一区二区| 色综合五月婷婷| 91偷拍与自偷拍精品| 国产一区二区三区四区在线| 亚洲欧美日韩精品久久久久| 日本一区二区三区四区五区| 色素色在线综合| av中文字幕第一页| 亚洲色图激情小说| 在线观看中文| 国产精品视频久久| 日韩有码中文字幕在线| 中文字幕欧美日韩一区二区| 国产午夜精品一区二区三区欧美| www.cao超碰| 久久久五月婷婷| 精品无码黑人又粗又大又长| 欧美午夜不卡视频| 四虎影视在线播放| 色综合视频一区中文字幕| 韩日精品一区| 精品蜜桃传媒| 黑人一区二区三区四区五区| 男操女免费网站| 久久日韩粉嫩一区二区三区| 欧美人妻精品一区二区免费看| 欧美午夜理伦三级在线观看| 日本加勒比一区| 欧美精品在线播放| 日韩一级视频| 日本成人黄色免费看| 99精品国产福利在线观看免费 | 日韩a级大片| 国产情侣第一页| 国产精品综合在线视频| 亚洲av毛片基地| 色菇凉天天综合网| 无码国产精品一区二区色情男同| 欧美美最猛性xxxxxx| 亚洲人体在线| 一区二区三区视频| 久久精品72免费观看| 亚洲AV无码成人精品区明星换面| 精品福利在线视频| 欧美综合视频在线| 欧美黄色片在线观看| 日韩激情欧美| 国产免费xxx| 国产精品一区二区91| 欧美特级一级片| 日韩免费一区二区| 日韩av毛片| 北条麻妃高清一区| 亚洲小说区图片区| 91porn在线| 亚洲国产精品影院| 亚洲高清在线观看视频| 欧美高清视频免费观看| 成人中文字幕视频| 免费看欧美一级片| 成人性生交大片免费| 日本一区二区不卡在线| 亚洲国产欧美精品| 在线观看爽视频| 欧美日本韩国国产| 日韩精品国产精品| 欧美福利在线视频| 欧美精品自拍偷拍动漫精品| 免费a级毛片在线播放| 亚洲xxxxx| 伊人久久亚洲影院| 影音先锋人妻啪啪av资源网站| 精品福利视频导航| 国产黄在线播放| 国产日韩中文字幕| 午夜日韩福利| 欧美一级片黄色| 日韩欧美一区二区三区| 福利片在线观看| 成人黄色短视频在线观看| 亚洲一区二区日韩| 日批在线观看视频| 在线亚洲一区观看| 成a人片在线观看| 国产综合欧美在线看| 日本视频一区二区三区| 91嫩草丨国产丨精品| 亚洲第一偷拍网| www.26天天久久天堂| 成人国产一区二区三区| 99精品视频一区二区三区| japanese国产在线观看| 久久精品一偷一偷国产| xxxx日韩| 人人干人人干人人| 亚洲国产视频直播| 国产二区视频在线观看| 99热99热| 日韩成人精品在线观看| 老熟妻内射精品一区| 欧美精品一区二区三区蜜桃视频 | 亚洲在线视频观看| 亚洲精品影视| 国产精品精品软件男同| 日韩av一卡二卡| 亚洲精品毛片| 欧美色图另类小说| |精品福利一区二区三区| 三级在线播放| 91久久偷偷做嫩草影院| 久久久久久9| 国产网站在线看| www.久久色.com| 美女网站一区| 国产高潮视频在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 精品视频一区三区九区|