国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

父組件明明使用了v-model,子組件竟然可以不用定義props和emit拋出事件,快來看看吧

這篇具有很好參考價值的文章主要介紹了父組件明明使用了v-model,子組件竟然可以不用定義props和emit拋出事件,快來看看吧。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

vue3.4增加了defineModel宏函數(shù),在子組件內修改了defineModel的返回值,父組件上v-model綁定的變量就會被更新。大家都知道v-model:modelValue@update:modelValue的語法糖,但是你知道為什么我們在子組件內沒有寫任何關于props的定義和emit事件觸發(fā)的代碼嗎?還有在template渲染中defineModel的返回值等于父組件v-model綁定的變量值,那么這個返回值是否就是名為modelValue的props呢?直接修改defineModel的返回值就會修改父組件上面綁定的變量,那么這個行為是否相當于子組件直接修改了父組件的變量值,破壞了vue的單向數(shù)據(jù)流呢?

先說答案

defineModel宏函數(shù)經過編譯后會給vue組件對象上面增加modelValue的props選項和update:modelValue的emits選項,執(zhí)行defineModel宏函數(shù)的代碼會變成執(zhí)行useModel函數(shù),如下圖:
父組件明明使用了v-model,子組件竟然可以不用定義props和emit拋出事件,快來看看吧

經過編譯后defineModel宏函數(shù)已經變成了useModel函數(shù),而useModel函數(shù)的返回值是一個ref對象。注意這個是ref對象不是props,所以我們才可以在組件內直接修改defineModel的返回值。當我們對這個ref對象進行“讀操作”時,會像Proxy一樣被攔截到ref對象的get方法。在get方法中會返回本地維護localValue變量,localValue變量依靠watchSyncEffectlocalValue變量始終和父組件傳遞的modelValueprops值一致。

對返回值進行“寫操作”會被攔截到ref對象的set方法中,在set方法中會將最新值同步到本地維護localValue變量,調用vue實例上的emit方法拋出update:modelValue事件給父組件,由父組件去更新父組件中v-model綁定的變量。如下圖:
父組件明明使用了v-model,子組件竟然可以不用定義props和emit拋出事件,快來看看吧

所以在子組件內無需寫任何關于props的定義和emit事件觸發(fā)的代碼,因為在編譯defineModel宏函數(shù)的時候已經幫我們生成了modelValue的props選項。在對返回的ref變量進行寫操作時會觸發(fā)set方法,在set方法中會調用vue實例上的emit方法拋出update:modelValue事件給父組件。

defineModel宏函數(shù)的返回值是一個ref變量,而不是一個props。所以我們可以直接修改defineModel宏函數(shù)的返回值,父組件綁定的變量之所以會改變是因為在底層會拋出update:modelValue事件給父組件,由父組件去更新綁定的變量,這一行為當然滿足vue的單向數(shù)據(jù)流。

什么是vue的單向數(shù)據(jù)流

vue的單向數(shù)據(jù)流是指,通過props將父組件的變量傳遞給子組件,在子組件中是沒有權限去修改父組件傳遞過來的變量。只能通過emit拋出事件給父組件,讓父組件在事件回調中去修改props傳遞的變量,然后通過props將更新后的變量傳遞給子組件。在這一過程中數(shù)據(jù)的流動是單向的,由父組件傳遞給子組件,只有父組件有數(shù)據(jù)的更改權,子組件不可直接更改數(shù)據(jù)。
父組件明明使用了v-model,子組件竟然可以不用定義props和emit拋出事件,快來看看吧

一個defineModel的例子

我在前面的 一文搞懂 Vue3 defineModel 雙向綁定:告別繁瑣代碼!文章中已經講過了defineModel的各種用法,在這篇文章中我們就不多余贅述了。我們直接來看一個簡單的defineModel的例子。

下面這個是父組件的代碼:

<template>
  <CommonChild v-model="inputValue" />
  <p>input value is: {{ inputValue }}</p>
</template>

<script setup lang="ts">
import { ref } from "vue";
import CommonChild from "./child.vue";

const inputValue = ref();
</script>

父組件的代碼很簡單,使用v-model指令將inputValue變量傳遞給子組件。然后在父組件上使用p標簽渲染出inputValue變量的值。

我們接下來看子組件的代碼:

<template>
  <input v-model="model" />
  <button @click="handelReset">reset</button>
</template>

<script setup lang="ts">
const model = defineModel();

function handelReset() {
  model.value = "init";
}
</script>

子組件內的代碼也很簡單,將defineModel的返回值賦值給model變量。然后使用v-model指令將model變量綁定到子組件的input輸入框上面。并且還在按鈕的click事件時使用model.value = "init"將綁定的值重置為init字符串。請注意在子組件中我們沒有任何定義props的代碼,也沒有拋出emit事件的代碼。而是通過defineModel宏函數(shù)的返回值來接收父組件傳過來的名為modelValue的prop,并且在子組件中是直接通過給defineModel宏函數(shù)的返回值進行賦值來修改父組件綁定的inputValue變量的值。

defineModel編譯后的樣子

要回答前面提的幾個問題,我們還是得從編譯后的子組件代碼說起。下面這個是經過簡化編譯后的子組件代碼:

import {
  defineComponent as _defineComponent,
  useModel as _useModel
} from "/node_modules/.vite/deps/vue.js?v=23bfe016";

const _sfc_main = _defineComponent({
  __name: "child",
  props: {
    modelValue: {},
    modelModifiers: {},
  },
  emits: ["update:modelValue"],
  setup(__props) {
    const model = _useModel(__props, "modelValue");
    function handelReset() {
      model.value = "init";
    }
    const __returned__ = { model, handelReset };
    return __returned__;
  },
});

function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
  return (
    // ... 省略
  );
}
_sfc_main.render = _sfc_render;
export default _sfc_main;

從上面我們可以看到編譯后主要有_sfc_main_sfc_render這兩塊,其中_sfc_renderrender函數(shù),不是我們這篇文章關注的重點。我們來主要看_sfc_main對象,看這個對象的樣子有name、props、emits、setup屬性,我想你也能夠猜出來他就是vue的組件對象。從組件對象中我們可以看到已經有了一個modelValueprops屬性,還有使用emits選項聲明了update:modelValue事件。我們在源代碼中沒有任何地方有定義propsemits選項,很明顯這兩個是通過編譯defineModel宏函數(shù)而來的。

我們接著來看里面的setup函數(shù),可以看到經過編譯后的setup函數(shù)中代碼和我們的源代碼很相似。只有defineModel不在了,取而代之的是一個useModel函數(shù)。

// 編譯前的代碼
const model = defineModel();

// 編譯后的代碼
const model = _useModel(__props, "modelValue");

還是同樣的套路,在瀏覽器的sources面板上面找到編譯后的js文件,然后給這個useModel打個斷點。至于如何找到編譯后的js文件我們在前面的文章中已經講了很多遍了,這里就不贅述了。刷新瀏覽器我們看到斷點已經走到了使用useModel函數(shù)的地方,我們這里給useModel函數(shù)傳了兩個參數(shù)。第一個參數(shù)為子組件接收的props對象,第二個參數(shù)是寫死的字符串modelValue。進入到useModel函數(shù)內部,簡化后的useModel函數(shù)是這樣的:

function useModel(props, name) {
  const i = getCurrentInstance();
  const res = customRef((track2, trigger2) => {
    watchSyncEffect(() => {
      // 省略
    });
  });
  return res;
}

從上面的代碼中我們可以看到useModel中使用到的函數(shù)沒有一個是vue內部源碼專用的函數(shù),全都是調用的vue暴露出來的API。這意味著我們可以參考defineModel的實現(xiàn)源碼,也就是useModel函數(shù),然后根據(jù)自己實際情況改良一個適合自己項目的defineModel函數(shù)。

我們先來簡單介紹一下useModel函數(shù)中使用到的API,分別是getCurrentInstance、customRefwatchSyncEffect,這三個API都是從vue中import導入的。

getCurrentInstance函數(shù)

首先來看看getCurrentInstance函數(shù),他的作用是返回當前的vue實例。為什么要調用這個函數(shù)呢?因為在setup中this是拿不到vue實例的,后面對值進行寫操作時會調用vue實例上面的emit方法拋出update事件。

watchSyncEffect函數(shù)

接著我們來看watchSyncEffect函數(shù),這個API大家平時應該比較熟悉了。他的作用是立即運行一個函數(shù),同時響應式地追蹤其依賴,并在依賴更改時立即重新執(zhí)行這個函數(shù)。

比如下面這段代碼,會立即執(zhí)行console,當count變量的值改變后,也會立即執(zhí)行console。

const count = ref(0)

watchSyncEffect(() => console.log(count.value))
// -> 輸出 0

customRef函數(shù)

最后我們來看customRef函數(shù),他是useModel函數(shù)的核心。這個函數(shù)小伙伴們應該用的比較少,我們這篇文章只簡單講講他的用法即可。如果小伙伴們對customRef函數(shù)感興趣可以留言或者給我發(fā)消息,關注的小伙伴們多了我后面會安排一篇文章來專門講customRef函數(shù)。官方的解釋為:

創(chuàng)建一個自定義的 ref,顯式聲明對其依賴追蹤和更新觸發(fā)的控制方式。customRef()?預期接收一個工廠函數(shù)作為參數(shù),這個工廠函數(shù)接受?track?和?trigger?兩個函數(shù)作為參數(shù),并返回一個帶有?get?和?set?方法的對象。

這句話的意思是customRef函數(shù)的返回值是一個ref對象。當我們對返回值ref對象進行“讀操作”時,會被攔截到ref對象的get方法中。當我們對返回值ref對象進行“寫操作”時,會被攔截到ref對象的set方法中。和Promise相似同樣接收一個工廠函數(shù)作為參數(shù),Promise的工廠函數(shù)是接收的resolvereject兩個函數(shù)作為參數(shù),customRef的工廠函數(shù)是接收的tracktrigger兩個函數(shù)作為參數(shù)。track用于手動進行依賴收集,trigger函數(shù)用于手動進行依賴觸發(fā)。

我們知道vue的響應式原理是由依賴收集和依賴觸發(fā)的方式實現(xiàn)的,比如我們在template中使用一個ref變量。當template被編譯為render函數(shù)后,在瀏覽器中執(zhí)行render函數(shù)時,就會對ref變量進行讀操作。讀操作會被攔截到Proxy的get方法中,由于此時在執(zhí)行render函數(shù),所以當前的依賴就是render函數(shù)。在get方法中會進行依賴收集,將當前的render函數(shù)作為依賴收集起來。注意這里的依賴收集是vue內部自動完成的,在我們的代碼中無需手動去進行依賴收集。

當我們對ref變量進行寫操作時,此時會被攔截到Proxy的set方法,在set方法中會將收集到的依賴依次取出來執(zhí)行,我們前面收集的依賴是render函數(shù)。所以render函數(shù)就會重新執(zhí)行,執(zhí)行render函數(shù)生成虛擬DOM,再生成真實DOM,這樣瀏覽器中渲染的就是最新的ref變量的值。同樣這里依賴觸發(fā)也是在vue內部自動完成的,在我們的代碼中無需手動去觸發(fā)依賴。

搞清楚了依賴收集和依賴觸發(fā)現(xiàn)在來講tracktrigger兩個函數(shù)你應該就能很容易理解了,tracktrigger兩個函數(shù)可以讓我們手動控制什么時候進行依賴收集和依賴觸發(fā)。執(zhí)行track函數(shù)就會手動收集依賴,執(zhí)行trigger函數(shù)就會手動觸發(fā)依賴,進行頁面刷新。在defineModel這個場景中track手動收集的依賴就是render函數(shù),trigger手動觸發(fā)會導致render函數(shù)重新執(zhí)行,進而完成頁面刷新。

useModel函數(shù)

現(xiàn)在我們可以來看useModel函數(shù)了,簡化后的代碼如下:

function useModel(props, name) {
  const i = getCurrentInstance();

  const res = customRef((track2, trigger2) => {
    let localValue;
    watchSyncEffect(() => {
      const propValue = props[name];
      if (hasChanged(localValue, propValue)) {
        localValue = propValue;
        trigger2();
      }
    });
    return {
      get() {
        track2();
        return localValue;
      },
      set(value) {
        if (hasChanged(value, localValue)) {
          localValue = value;
          trigger2();
        }
        i.emit(`update:${name}`, value);
      },
    };
  });
  return res;
}

從上面我們可以看到useModel函數(shù)的代碼其實很簡單,useModel的返回值就是customRef函數(shù)的返回值,也就是一個ref變量對象。我們看到返回值對象中有getset方法,還有在customRef函數(shù)中使用了watchSyncEffect函數(shù)。

get方法

在前面的demo中,我們在子組件的template中使用v-modeldefineModel的返回值綁定到一個input輸入框中。代碼如下:

<input v-model="model" />

在第一次執(zhí)行render函數(shù)時會對model變量進行讀操作,而model變量是defineModel宏函數(shù)的返回值。編譯后我們看到defineModel宏函數(shù)變成了useModel函數(shù)。所以對model變量進行讀操作,其實就是對useModel函數(shù)的返回值進行讀操作。我們看到useModel函數(shù)的返回值是一個自定義ref,在自定義ref中有get和set方法,當對自定義ref進行讀操作時會被攔截到ref對象中的get方法。這里在get方法中會手動執(zhí)行track2方法進行依賴收集。因為此時是在執(zhí)行render函數(shù),所以收集到的依賴就是render函數(shù),然后將本地維護的localValue的值進行攔截返回。

set方法

在我們前面的demo中,子組件reset按鈕的click事件中會對defineModel的返回值model變量進行寫操作,代碼如下:

function handelReset() {
  model.value = "init";
}

和對model變量“讀操作”同理,對model變量進行“寫操作”也會被攔截到返回值ref對象的set方法中。在set方法中會先判斷新的值和本地維護的localValue的值比起來是否有修改。如果有修改那就將更新后的值同步更新到本地維護的localValue變量,這樣就保證了本地維護的localValue始終是最新的值。然后執(zhí)行trigger2函數(shù)手動觸發(fā)收集的依賴,在前面get的時候收集的依賴是render函數(shù),所以這里觸發(fā)依賴會重新執(zhí)行render函數(shù),然后將最新的值渲染到瀏覽器上面。

在set方法中接著會調用vue實例上面的emit方法進行拋出事件,代碼如下:

i.emit(`update:${name}`, value)

這里的i就是getCurrentInstance函數(shù)的返回值。前面我們講過了getCurrentInstance函數(shù)的返回值是當前vue實例,所以這里就是調用vue實例上面的emit方法向父組件拋出事件。這里的name也就是調用useModel函數(shù)時傳入的第二個參數(shù),我們來回憶一下前面是怎樣調用useModel函數(shù)的 ,代碼如下:

const model = _useModel(__props, "modelValue")

傳入的第一個參數(shù)為當前的props對象,第二個參數(shù)是寫死的字符串"modelValue"。那這里調用emit拋出的事件就是update:modelValue,傳遞的參數(shù)為最新的value的值。這就是為什么不需要在子組件中使用使用emit拋出事件,因為在defineModel宏函數(shù)編譯成的useModel函數(shù)中已經幫我們使用emit拋出事件了。

watchSyncEffect函數(shù)

我們接著來看子組件中怎么接收父組件傳遞過來的props呢,答案就在watchSyncEffect函數(shù)中?;貞浺幌虑懊嬷v過的useModel函數(shù)中的watchSyncEffect代碼如下:

function useModel(props, name) {
  const res = customRef((track2, trigger2) => {
    let localValue;
    watchSyncEffect(() => {
      const propValue = props[name];
      if (hasChanged(localValue, propValue)) {
        localValue = propValue;
        trigger2();
      }
    });
    return {
     // ...省略
    };
  });
  return res;
}

這個name也就是調用useModel函數(shù)時傳過來的第二個參數(shù),我們前面已經講過了是一個寫死的字符串"modelValue"。那這里的const propValue = props[name]就是取父組件傳遞過來的名為modelValueprop,我們知道v-model就是:modelValue的語法糖,所以這個propValue就是取的是父組件v-model綁定的變量值。如果本地維護的localValue變量的值不等于父組件傳遞過來的值,那么就將本地維護的localValue變量更新,讓localValue變量始終和父組件傳遞過來的值一樣。并且觸發(fā)依賴重新執(zhí)行子組件的render函數(shù),將子組件的最新變量的值更新到瀏覽器中。為什么要調用trigger2函數(shù)呢?原因是可以在子組件的template中渲染defineModel函數(shù)的返回值,也就是父組件傳遞過來的prop變量。如果父組件傳遞過來的prop變量值改變后不重新調用trigger2函數(shù)以重新執(zhí)行render函數(shù),那么子組件中的渲染的變量值就一直都是舊的值了。因為這個是在watchSyncEffect內執(zhí)行的,所以每次父組件傳過來的props值變化后都會再執(zhí)行一次,讓本地維護的localValue變量的值始終等于父組件傳遞過來的值,并且子組件頁面上也始終渲染的是最新的變量值。

這就是為什么在子組件中沒有任何props定義了,因為在defineModel宏函數(shù)編譯后會給vue組件對象塞一個modelValue的prop,并且在useModel函數(shù)中會維護一個名為localValue的本地變量接收父組件傳遞過來的props.modelValue,并且讓localValue變量和props.modelValue的值始終保持一致。

總結

現(xiàn)在我們可以回答前面提的幾個問題了:

  • 使用defineModel宏函數(shù)后,為什么我們在子組件內沒有寫任何關于props定義的代碼?

    答案是本地會維護一個localValue變量接收父組件傳遞過來的名為modelValue的props。調用defineModel函數(shù)的代碼經過編譯后會變成一個調用useModel函數(shù)的代碼,useModel函數(shù)的返回值是一個ref對象。當我們對defineModel的返回值進行“讀操作”時,類似于Proxyget方法一樣會對讀操作進行攔截到返回值ref對象的get方法中。而get方法的返回值為本地維護的localValue變量,在watchSyncEffect的回調中將父組件傳遞過來的名為modelValue的props賦值給本地維護的localValue變量。并且由于是在watchSyncEffect中,所以每次props改變都會執(zhí)行這個回調,所以本地維護的localValue變量始終是等于父組件傳遞過來的modelValue。也正是因為defineModel宏函數(shù)的返回值是一個ref對象而不是一個prop,所以我們可以在子組件內直接將defineModel的返回值使用v-model綁定到子組件input輸入框上面。

  • 使用defineModel宏函數(shù)后,為什么我們在子組件內沒有寫任何關于emit事件觸發(fā)的代碼?

    答案是因為調用defineModel函數(shù)的代碼經過編譯后會變成一個調用useModel函數(shù)的代碼,useModel函數(shù)的返回值是一個ref對象。當我們直接修改defineModel的返回值,也就是修改useModel函數(shù)的返回值。類似于Proxyset方法一樣會對寫行為進行攔截到ref對象中的set方法中。在set方法中會手動觸發(fā)依賴,render函數(shù)就會重新執(zhí)行,瀏覽器上就會渲染最新的變量值。然后調用vue實例上的emit方法,向父組件拋出update:modelValue事件。并且將最新的值隨著事件一起傳遞給父組件,由父組件在update:modelValue事件回調中將父組件中v-model綁定的變量更新為最新值。

  • template渲染中defineModel的返回值等于父組件v-model綁定的變量值,那么這個返回值是否就是名為modelValue的props呢?

    從第一個回答中我們知道defineModel的返回值不是props,而是一個ref對象。

  • 直接修改defineModel的返回值就會修改父組件上面綁定的變量,那么這個行為是否相當于子組件直接修改了父組件的變量值,破壞了vue的單向數(shù)據(jù)流呢?

    修改defineModel的返回值,就會更新父組件中v-model綁定的變量值。看著就像是子組件中直接修改了父組件的變量值,從表面上看著像是打破了vue的單向數(shù)據(jù)流。實則并不是那樣的,雖然我們在代碼中沒有寫過emit拋出事件的代碼,但是在defineModel函數(shù)編譯成的useModel函數(shù)中已經幫我們使用emit拋出事件了。所以并沒有打破vue的單向數(shù)據(jù)流

關注公眾號:前端歐陽,解鎖我更多vue干貨文章。還可以加我微信,私信我想看哪些vue原理文章,我會根據(jù)大家的反饋進行創(chuàng)作。
父組件明明使用了v-model,子組件竟然可以不用定義props和emit拋出事件,快來看看吧
父組件明明使用了v-model,子組件竟然可以不用定義props和emit拋出事件,快來看看吧文章來源地址http://www.zghlxwxcb.cn/news/detail-844273.html

到了這里,關于父組件明明使用了v-model,子組件竟然可以不用定義props和emit拋出事件,快來看看吧的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 組件v-model(.sync)記錄使用(vue3)

    組件v-model(.sync)記錄使用(vue3)

    首先,讓我們來了解一下Vue3中v-model的用法。在Vue3中, v-model 指令可以用于自定義組件上,用于實現(xiàn)組件的雙向數(shù)據(jù)綁定。與Vue2中的 .sync 不同, Vue3中的v-model需要在組件中手動實現(xiàn)雙向綁定邏輯。 下面是一個簡單的父組件示例,展示了如何在Vue3中使用 v-model 來實現(xiàn)組件的雙

    2024年01月19日
    瀏覽(26)
  • vue3基礎(五)watch(淺監(jiān)聽及深度監(jiān)聽),鼠標及鍵盤修飾符,v-model,對象寫法,class使用數(shù)組,字符串模版,自定義組件標簽上添加事件無效,使用data時用別名替代,solt輸出內容

    vue3基礎(五)watch(淺監(jiān)聽及深度監(jiān)聽),鼠標及鍵盤修飾符,v-model,對象寫法,class使用數(shù)組,字符串模版,自定義組件標簽上添加事件無效,使用data時用別名替代,solt輸出內容

    監(jiān)聽中的 方法名 與 需要監(jiān)聽的 變量名 一致 如果沒有(例如aa), 不會報錯 ,但監(jiān)聽不到 所以上圖會 輸出1 ,而不會輸出2 newValue改變后的值,oldValue改變前的值 watch 可以監(jiān)聽 computed 計算屬性中的方法,變量等等 點擊go按鈕,調用change方法修改kk的值,computed中有kk,所以

    2024年02月15日
    瀏覽(37)
  • 在vue2使用v-model對組件進行雙向綁定

    v-model=“visible” 等價于 :value=“visible” 加上 @input=“visible = $event” 所以 v-model 就是父組件向子組件傳了個 value 字段的值,子組件使用 props 定義 value 字段, 就可以在子組件使用 value 讀取這個值;子組件使用 $emit(‘input’,值) 就可以改變 v-model 的值 父組件 子組件 父組件 子

    2024年02月10日
    瀏覽(17)
  • Vue3-在HTML標簽、組件標簽上使用v-model

    本篇為Vue3學習中遇到的v-model相關的記錄,如有問題歡迎指正 v-model通常在input、select等標簽上來實現(xiàn)數(shù)據(jù)雙向綁定 原理 :v-model通過給標簽value賦值來實現(xiàn)? 數(shù)據(jù)—頁面 的綁定。然后通過綁定input事件實現(xiàn) 頁面—數(shù)據(jù) 的綁定。 原理 :在組件上時,v-model通過 :modelValue 來進行

    2024年01月24日
    瀏覽(25)
  • 面試官:在原生input上面使用v-model和組件上面使用有什么區(qū)別?

    面試官:在原生input上面使用v-model和組件上面使用有什么區(qū)別?

    還是上一篇面試官:來說說vue3是怎么處理內置的v-for、v-model等指令? 文章的那個粉絲,面試官接著問了他另外一個v-model的問題。 面試官:vue3的v-model都用過吧,來講講。 粉絲:v-model其實就是一個語法糖,在編譯時v-model會被編譯成 :modelValue 屬性和 @update:modelValue 事件。一般

    2024年04月23日
    瀏覽(25)
  • 【vue2第十一章】v-model的原理詳解 與 如何使用v-model對父子組件的value綁定 和修飾符.sync

    【vue2第十一章】v-model的原理詳解 與 如何使用v-model對父子組件的value綁定 和修飾符.sync

    v-model的原理詳解 v-model的本質就是一個語法糖,實際上就是 :value=\\\"msg\\\" 與 @input=\\\"msg = $event.target.value\\\" 的簡寫。 :value=\\\"msg\\\" 從數(shù)據(jù)單向綁定到input框,當data數(shù)據(jù)中的msg內容一旦改變,而input框數(shù)據(jù)也隨之改變。 @input=\\\"msg = $event.target.value\\\" 是為input框綁定了input事件,內容改變則觸發(fā)

    2024年02月10日
    瀏覽(21)
  • 【Vue技巧】Vue2和Vue3組件上使用v-model的實現(xiàn)原理

    ChatGPT4.0國內站點,支持GPT4 Vision 視覺模型:海鯨AI 在Vue中, v-model 是一個語法糖,用于在輸入框、選擇框等表單元素上創(chuàng)建雙向數(shù)據(jù)綁定。當你在自定義組件中實現(xiàn) v-model 功能時,你需要理解它背后的原理: v-model 實際上是一個屬性和一個事件的簡寫。 在 Vue 2.x 中, v-mode

    2024年01月15日
    瀏覽(30)
  • vue項目中對組件使用v-model綁定值,在vue3中如何更新數(shù)據(jù)

    vue項目中對組件使用v-model綁定值,在vue3中如何更新數(shù)據(jù)

    在el-form 中 el-form-item 綁定組件進行校驗 想在表單下面爆紅提示 可以對組件使用v-model綁定值 vue2 通過this.$emit(‘input’,value) 更新 v-model值 vue3 通過this.$emit(‘update:modelValue’ ,value) 更新 v-model值

    2024年02月15日
    瀏覽(20)
  • 組件v-model

    最近看到vue版本更新到3.4.x了,其中有個defineModel API,defineModel在3.3的時候是作為實驗特性發(fā)布的,在3.4中逐漸穩(wěn)定。這個API就是Vue3簡化組件v-model的寫法的,所以這篇就一塊兒來總結一下vue中的組件v-model 官網(wǎng)的示例 ?先說下vue2中的使用,再說下vue3中的使用 下面這個單個v

    2024年02月01日
    瀏覽(17)
  • vue父子組件傳值(v-model)

    子組件使用 props 接收父組件傳來的值 1)這里有個大坑, el-dialog 中一定要用 model-value 來代替 v-model ,不能用 v-model ,否則會報錯 (2)子組件中修改父組件傳入的參數(shù) visible 時,使用 ??方式

    2024年02月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包