国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

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

1.  Options API

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

<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)過多次討論、來自社區(qū)的反饋,以及令人驚訝的是,在這個(gè) RFC 中,有很多戲劇性的內(nèi)容,在 Vue 3 中引入了 Composition API。 目的是提供更靈活的 API 和更好的 TypeScript 支持。這種方法在很大程度上依賴于設(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è)很好的中間步驟,但是語法糖可以讓一切變得更干凈。

3.Script setup

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

<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

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

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

<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 訪問反應(yīng)式計(jì)數(shù)器感覺不自然,并且是混淆和錯(cuò)誤輸入的常見來源。 

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

<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)建步驟,但在訪問變量時(shí)刪除了 .value 的必要性。啟用后它在全球范圍內(nèi)可用。

5.Class API

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

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

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

<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)和類 API 可以用作中間步驟,但它們不應(yīng)該是您的首選。 

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

責(zé)任編輯:華軒 來源: web前端開發(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)對象

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類型保護(hù)

2018-12-19 19:30:46

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

2023-05-09 15:01:43

JavaScript編程語言異常處理

2021-11-02 07:54:40

List分片Java

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

2022-05-06 08:47:10

Vue 3組件前端

2023-04-19 15:29:53

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

2022-08-01 11:41:00

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

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

国内精品视频在线| 激情深爱一区二区| jizzjizz国产精品喷水| 日本久久久久亚洲中字幕| 欧美视频精品在线观看| 99精品在线观看视频| 国产精品久久占久久| 日本在线啊啊| 成年人羞羞的网站| 中文字幕av导航| 国产成人精品999| 亚洲精品综合精品自拍| 亚洲综合久久av| 国产91精品精华液一区二区三区 | 成人欧美一区二区三区白人| 欧美一级视频| 亚洲性视频大全| 丝袜美腿一区| 狠狠色伊人亚洲综合网站l| 成人三级视频在线播放| 欧美一区1区三区3区公司| 8090成年在线看片午夜| 亚洲天堂影视av| 欧美亚洲国产一区在线观看网站| 久久亚洲影视婷婷| 欧美a级理论片| 欧美搞黄网站| 亚洲最好看的视频| 色8久久久久| 波多野结衣在线观看| 久草在现在线| 色老板在线观看| 北条麻妃av高潮尖叫在线观看| 日韩一区国产在线观看| 91亚洲国产精品| 性欧美视频videos6一9| 精品中文视频在线| 欧美图区在线视频| 亚洲精品国产品国语在线app| 成人夜色视频网站在线观看| 91视频久久| 久久国产精彩视频| 欧美日韩午夜精品| 日韩伦理一区二区三区| 久久久91精品国产一区二区精品| 九九99久久| 91精品国产高清自在线看超| 中文字幕日韩高清| 亚洲福利影片在线| 久久免费电影| 奇米精品一区二区三区| 亚洲视频在线观看日本a| 国产乱码精品一区二区三区不卡| 国产美女精品视频免费观看| 68精品国产免费久久久久久婷婷| 欧美精品日韩三级| 色噜噜狠狠色综合网图区 | 韩国精品在线观看| 在线视频日韩| 亚洲香蕉av| 成人羞羞动漫| 精品在线手机视频| 精品国产午夜肉伦伦影院| 国产成人久久精品麻豆二区| 欧美一级大片| 成人va天堂| 先锋欧美三级| 天天免费亚洲黑人免费| 欧美男男激情videos| √最新版天堂资源网在线| 91在线三级| 午夜伦理福利在线| 欧美成人精品三级网站| 99久久婷婷国产综合精品首页 | 可以免费看污视频的网站| 国产乱码精品一区二区三区亚洲人 | 1024欧美极品| 黄色精品视频| 久久精品国产99国产| 欧美一区二区三区免费在线看| 91视频国产高清| 在线播放你懂得| 天堂蜜桃91精品| 精品国内二区三区| 午夜在线视频免费观看| 男人的天堂免费在线视频| 国产成人在线观看| 亚洲淫片在线视频| 国产一级电影网| 久久精品一区二区三区不卡牛牛| 乱一区二区三区在线播放| 免费毛片在线不卡| xvideos成人免费中文版| av片在线观看| 色妞www精品视频| 1024av视频| av日韩在线免费观看| 欧美在线综合| 香蕉影视欧美成人| 国产一区二区三区高清| 91caoporn在线| 精品国产不卡一区二区| 国产夜色精品一区二区av| 91久久精品网| 国产精品久久久久福利| 手机福利视频欧美| 日韩一区精品| 亚洲欧洲中文日韩久久av乱码| 播播国产欧美激情| 永久免费的av网站| 美女国产一区| 日韩视频免费观看高清完整版| 国产精品免费视频一区二区| 亚洲精品午夜在线观看| 国产亚洲欧美日韩精品一区二区三区 | 可以免费看污视频的网站| 欧美xxxx做受欧美护士| 欧美亚洲在线| 色94色欧美sute亚洲线路二| 亚洲国产日韩美| 123成人网| 欧美日韩国产限制| 亚洲蜜桃在线| 好看不卡的中文字幕| 在线成人av影院| 亚洲欧洲一区二区| 亚洲五码在线| 欧美精品1区2区| 久久大片网站| 成人高清在线| 国产丶欧美丶日本不卡视频| 国产精品jizz在线观看麻豆| 日韩在线你懂得| 国产不卡一区二区在线播放| 日韩一卡二卡三卡四卡| 中文字幕亚洲欧美日韩高清| 成人福利视频网站| 风间由美一区二区av101| 色狮一区二区三区四区视频| 久久成人国产| 99视频在线精品| 亚洲国产精品久久人人爱| 日韩精品资源二区在线| 欧美xxxx14xxxxx性爽| 中文在线免费二区三区| 欧美日韩国产色| 欧美特级aaa| 国产不卡免费视频| 欧美日本亚洲| 国内精品久久久久久久久电影网| 51精品国自产在线| 最新四虎影在线在永久观看www| 久久久亚洲精品石原莉奈| 欧美婷婷久久| 亚洲国产免费| 成人啪啪免费看| 三级小说欧洲区亚洲区| 久久九九免费视频| 亚洲欧美在线成人| 日韩一二三区视频| 菠萝蜜视频国产在线播放| 欧美丝袜第三区| 日本免费中文字幕在线| 91麻豆精品国产91久久久久久久久 | 日韩a一区二区| 91精品国产综合久久久久| 成人一区二区av| 欧洲杯什么时候开赛| 欧美mv日韩mv| 九七影院理伦片| 国产欧美日韩综合精品一区二区| 激情av一区二区| 午夜精品一区二区三区在线观看| youjizz欧美| 亚洲成av人片一区二区| 欧美私人网站| 国产精品久久久精品| 98精品国产自产在线观看| 久久久久久国产精品一区| 在线免费观看av的网站| 熟女熟妇伦久久影院毛片一区二区| 成人在线综合网| 9191国产视频| 久久久精品免费网站| 午夜黄色一级片| 欧洲国产伦久久久久久久| 日韩另类在线| www.亚洲天堂| 国精品一区二区| 在线码字幕一区| 久久久久久久免费视频了| 国产字幕中文| 在线电影欧美成精品| 欧洲av一区二区| 美乳少妇欧美精品| 欧美日韩国产免费观看视频| 国产厕所精品在线观看| 久草热8精品视频在线观看| 国产黄色网页| 欧美videossexotv100|