vue2中如何自定义组件的v-model

 更新时间:2022年08月02日 09:48:23   作者:风如也  
这篇文章主要介绍了vue2中如何自定义组件的v-model,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

如何自定义组件的v-model

工作中经常会涉及到父子组件数据更新和页面相应数据样式改变的问题。

通俗点来说,就是涉及到公共组件的可以抽离出来作为子组件,如果父组件中与子组件相关的数据改变,子组件中的数据也会改变,如果子组件的数据改变,则需要做一定的处理才能改变父组件中的相关数据。

处理方式:考虑使用 自定义组件的v-model(vue2 中方式)

父组件

<search-tab :list="list" v-model="active" />
...
export default {
    data(){
        return {
            list: [],
            active: 0
        }
    }
}
...

子组件 SearchTab

<el-tabs :value="active" @tab-click="handleClick">
  <el-tab-pane v-for="(item, key) in list" :key="key" :label="item.name" :name="item.value"></el-tab-pane>
</el-tabs>
...
export default {
  name: 'SearchTab',
  props: {
    active: {
      type: Number,
      default: 0
    },
    list: Array
  },
  model: {
    prop: 'active',
    event: 'changeActive'
  },
  methods: {
    handleClick(val) {
      this.$emit('changeActive', val.name)
    }
  }
}
...

这种方式如果涉及到选中组件的选中样式问题,能够响应式

而如果我们不用自定义组件的 v-model 方法,而是普通的父子组件通信,子组件改变父组件的值通过子组件中声明的另一个来作为中间变量,监听中间变量的值来改变父组件中的值,这种方式虽然能改变值,但是选中样式却不能及时更新。

子组件示例

<el-tabs :value="active" @tab-click="handleClick">
  <el-tab-pane v-for="(item, key) in list" :key="key" :label="item.name" :name="item.value"></el-tab-pane>
</el-tabs>
...
export default {
  name: 'SearchTab',
  props: {
    name: String,
    activeTab: {
      type: String,
      default: '0'
    },
    list: Array
  },
  data() {
    return {
      active: this.activeTab
    }
  },
  watch: {
    active() {
      this.activeTab = this.active
    }
  },
  methods: {
    handleClick(val) {
      console.log(val)
    }
  }
}
...

vue2与vue3在自定义组件v-model的区别

在vue开发中,通常会对一个自定义的组件进行封装,并实现v-model双向绑定功能

在vue2中,通常这样实现

父组件

<template>
  <Child v-model="number"></Child>    
</template>
<script>
  export default {
    data() {
      return {
        number: 0
      }
    },
    components: {
      Child: () => import("./Child.vue")
    }
  }
</script>

子组件

<template>
  <button @click="handleClick">{{ value }}</button>
</template>
<script>
  export default {
    props: {
      value: Number
    },
    methods: {
      handleClick() {
        // 通过emit一个input事件出去,实现 v-model
        this.$emit('input', this.value + 1)
      }
    }
  }
</script>

在vue3中,通过这样实现

父组件

<template>
  <Child v-model="number"></Child>    
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
export default defineComponent({
  setup() {
    const number = ref(0);
    return {
      number
    };
  },
});
</script>

子组件

<template>
  <button @click="handleClick">{{ value }}</button>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
  props: {
    // 更换成了 modelValue
    modelValue: Number
  },
  setup(props, { emit }) {
    // 关闭弹出层
    const handleClick = () => emit('update:modelValue', props.modelValue + 1);
    return { handleClick };
  },
});
</script>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue3中组件数据通信方式总结

    Vue3中组件数据通信方式总结

    如果在面试中,面试官问你Vue组件之间有哪些数据通信方式,你会怎么回复,不要担心,本文为大家整理了超全的Vue3中组件数据通信方式,需要的小伙伴快收藏起来吧
    2023-06-06
  • 前端通过vue调用后端接口导出excel表格基本步骤

    前端通过vue调用后端接口导出excel表格基本步骤

    在Vue前端项目中,可通过axios库发送请求至后端获取Excel下载链接,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-10-10
  • nuxt+axios解决前后端分离SSR的示例代码

    nuxt+axios解决前后端分离SSR的示例代码

    这篇文章主要介绍了nuxt+axios解决前后端分离SSR的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • vue 实现在同一界面实现组件的动态添加和删除功能

    vue 实现在同一界面实现组件的动态添加和删除功能

    这篇文章主要介绍了vue 实现在同一界面实现组件的动态添加和删除,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Vue 计算属性 computed

    Vue 计算属性 computed

    这篇文章主要介绍了Vue 计算属性 computed,一般情况下属性都是放到data中的,但是有些属性可能是需要经过一些逻辑计算后才能得出来,那么我们可以把这类属性变成计算属性,下面我们来看看具体实例,需要的朋友可以参考一下
    2021-10-10
  • vue中transition动画使用(移动端页面切换左右滑动效果)

    vue中transition动画使用(移动端页面切换左右滑动效果)

    这篇文章主要介绍了vue中transition动画使用(移动端页面切换左右滑动效果),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 说说Vuex的getters属性的具体用法

    说说Vuex的getters属性的具体用法

    这篇文章主要介绍了说说Vuex的getters属性的具体用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • 解决vue刷新页面以后丢失store的数据问题

    解决vue刷新页面以后丢失store的数据问题

    这篇文章主要介绍了解决vue刷新页面以后丢失store的数据问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 浅谈vue获得后台数据无法显示到table上面的坑

    浅谈vue获得后台数据无法显示到table上面的坑

    这篇文章主要介绍了浅谈vue获得后台数据无法显示到table上面的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Vue解决移动端弹窗滚动穿透问题

    Vue解决移动端弹窗滚动穿透问题

    这篇文章主要介绍了Vue解决移动端弹窗滚动穿透问题的方法,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2020-12-12

最新评论