【VUE3 之 v-model 绑定子组件的 新特性讲解 & 使用】绑定单个&&多个 v-model、自定义修饰符

45 篇文章 6 订阅

简单的基本内容:本章讲解的为:使用方式4 `components`

  • 使用限制:
  1. `<input>`
  2. `<select>`
  3. `<textarea>`
  4. `components`
  • 修饰符:
  1. `.lazy` - 监听 `change` 而不是 `input` 事件
  2. `.number` - 输入字符串转为有效的数字
  3. `.trim` - 输入首尾空格过滤  

本章内容:v-model绑定子组件的默认方式、绑定多个v-model、自定义v-model修饰符

例子1:

对子组件标签直接使用 v-model 时

子组件 props 默认值为 'modelValue'

emits 默认值为 'update:modelValue'

// 父组件
<template>
  <modelChild v-model="bookTitle" />
</template>


// 子组件
<template>
  <input :value="modelValue" @input="changeData"/>
</template>
<script>
export default {
  props:['modelValue'],
  emits:['update:modelValue'],
  methods:{
    changeData(val){
      this.$emit('update:modelValue', val)
    },
  }
}
</script>

备注:为了遵从组件通信间的单向数据流的规范,禁止对props进行双向绑定了。

(vloar低版本且不使用defineComponent的情况下,对props双向绑定不会报错,但为了规范,官方也禁止对props进行双向绑定!)

例子2:高阶用法

讲解知识点:`v-model`参数、多个`v-model`绑定、自定义`v-model`修饰符

  1. 自定义修饰符:对于带参数的 v-model 绑定,生成的 prop 名称将为 arg + "Modifiers",然后`[参数名]Modifiers.[修饰符名]`使用
  2. `props`的内容:`[参数名]`,自定义修饰符的为`[参数名]Modifiers`
  3. `emits`的内容:`update:[参数名]`

父组件:

<template>
  <vModelText v-model:text="data1" v-model:num.numReg="numData">
  </vModelText>
</template>
<script>
export default {
  data(){
    return{
      data1:"data1的数据",
      numData: 0,
    }
  }
}
</script>

子组件:

<template>
  <el-input :modelValue="text" @input="changeText" placeholder="vModelText-Please input" style='width:300px' />
  <el-input :modelValue="myNum" @blur="numChange" placeholder="只能输入数字哦" style='width:150px' />
</template>
<script>
export default {
  props:['text','num','numModifiers'],
  emits:['update:text','update:num'],
  data(){
    return{
      myNum:'',
      focusData:'组件实例指令'
    }
  },
  methods:{
    numChange(event){
      let val = event?.target.value
      if (this.numModifiers) { 
      //如果v-model 没加.xx 自定义修饰符,则arg+Modifiers 此处就是undefined,所以要先判断这个
        if (this.numModifiers.numReg&&!Number(val)) {
          // 当父组件引用该组件,并且v-model:title加了.capitalize修饰符的时候,就会执行该修饰符定义的功能
          // 执行.capitalize的相关功能
          // titleModifiers:这个由title+Modifiers组合而成,也就是.capitalize绑定在:title上的
          console.error('请填写数字哦!');
          val=''
        }
      }
      this.myNum = val
      this.$emit('update:num',val)
    },
    changeText(val){
      this.$emit('update:text',val)
      console.log(val);
    },
  }
}
</script>

 其他vue3 选项式api、组合式api、全局/应用api学习经验分享

vue3 学习资料vue3学习资料记录,经验交流、分享https://oumae-kumiko.github.io/vue3.cn.community/

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:父组件通过ref定义组件实例,通过调用实例获得子组件的数据和方法。\[1\]引用\[2\]:东风vue3父组件调用子组件的方法是通过expose和ref来实现的,我们可以通过expose来控制父组件可以访问子组件那些的方法和对象。\[2\]引用\[3\]:选项式API中,父组件可以通过ref命令来获取子组件的实例,并调用子组件的方法。\[3\] 在Vue3中,父组件可以通过v-model定子组件,并接收子组件的值。首先,在父组件使用ref命令定义组件的实例,然后通过v-model定子组件的值。在子组件中,使用expose命令暴露需要传递给父组件的值。父组件可以通过访问子组件的实例来获取子组件的值。具体实现如下: 父组件app.vue: ```html &lt;template&gt; &lt;div class=&quot;itxst&quot;&gt; &lt;child ref=&quot;childComp&quot; v-model=&quot;childValue&quot;&gt;&lt;/child&gt; &lt;button @click=&quot;onClick&quot;&gt;点击试一试&lt;/button&gt; &lt;/div&gt; &lt;/template&gt; &lt;script setup&gt; import { ref } from &quot;vue&quot;; import child from &quot;./child.vue&quot;; const childComp = ref(null); const childValue = ref(&quot;&quot;); const onClick = () =&gt; { // 获取子组件的值 let value = childComp.value.childValue; console.log(value); }; &lt;/script&gt; ``` 子组件child.vue: ```html &lt;template&gt; &lt;div class=&quot;itxst&quot;&gt; &lt;input v-model=&quot;childValue&quot; /&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; import { ref, defineExpose } from &quot;vue&quot;; export default { name: &quot;child&quot;, setup() { const childValue = ref(&quot;&quot;); // 暴露需要传递给父组件的值 defineExpose({ childValue, }); return { childValue, }; }, }; &lt;/script&gt; ``` 在父组件中,我们使用ref命令定义了子组件的实例childComp,并使用v-model定了childValue。在子组件中,我们使用defineExpose命令暴露了childValue,使其可以被父组件访问到。父组件可以通过childComp.value.childValue来获取子组件的值。 #### 引用[.reference_title] - *1* *2* *3* [vue3父组件调用子组件的方法](https://blog.csdn.net/weixin_42252416/article/details/128001894)[target=&quot;_blank&quot; data-report-click={&quot;spm&quot;:&quot;1018.2226.3001.9630&quot;,&quot;extra&quot;:{&quot;utm_source&quot;:&quot;vip_chatgpt_common_search_pc_result&quot;,&quot;utm_medium&quot;:&quot;distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt&quot;}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值