vue3 封装自定义组件v-model的示例

 更新时间:2022年07月27日 09:48:25   作者:当代词圣李白  
这篇文章主要介绍了vue3 封装自定义组件v-model及自定义组件使用v-model,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

首先要注意 vue3中 v-model 默认绑定的变量名变了,从原理的 value 改成了 modelValue,
如果要改变变量的值,要执行一个事件 this.$emit("update:modelValue", value);

在这里插入图片描述

在这里插入图片描述

<template>
	<div class="inline">
		<input :type="password ? 'password' : 'text'" ref="input" @input="handleInput" @blur="handleBlur($event.target.value)" :placeholder="placeholder" />
	</div>
</template>
<script>
export default {
	name: "dg-Input",
	props: {
		type: {
			type: String,
			requided: true,
		},
		placeholder: {
			type: String,
		},
		password: {
			default: false,
		},
		modelValue: [String, Number],
	},
	data() {
		return {};
	},
	computed: {
		nativeInputValue() {
			return this.modelValue === null || this.modelValue === undefined ? "" : String(this.modelValue);
		},
	},
	methods: {
		handleInput(event) {
			let value = event.target.value;
			this.$emit("update:modelValue", value);
			this.$emit("input", value);
			this.$nextTick(this.setNativeInputValue);
		},
		setNativeInputValue() {
			const input = this.$refs.input;
			if (input.value === this.nativeInputValue) return;
			input.value = this.nativeInputValue;
		},

	
	},
	mounted() {
		this.setNativeInputValue();
	},
};
</script>
<style lang="scss" scoped>
.inline {
	display: inline-block;
	input {
		width: 100%;
		height: 100%;
		padding-left: 5px;
	}
}
</style>

vue3文档地址

补充:下面看下vue3中自定义组件使用v-model

vue2 中的v-model

v-model本质上是一个语法糖,如下代码

<input v-model="test">
<!--上面代码本质上就是下方代码-->
<input :value="test" @input="test = $event.target.value">

因此,对于一个带有 v-model 的组件(核心用法),它应该如下:

带有v-model的父组件通过绑定的value值(即v-model的绑定值)传给子组件,子组件通过 prop接收一个 value;
子组件利用oninput事件实时通过 $emit 触发父组件input 事件,并传入新值value给父组件;

父组件

<template>
    <div>
        <child v-model="msg" @input="msg = $event.target.value" />
        <!--<child :value="msg" @input="msg = $event.target.value" />-->
    </div>
</template>
<script>
import child from './components/Child.vue'
export default {
    components: {
        child
    },
    data() {
        return {
            msg: ''
        }
    }
}
</script>

子组件child

<template>
    <input type="text" :value="modelValue" @input="handleInput">
</template>
<script>
export default {
    name: 'Child',
    props:['value'],
    data() {
        return {
            modelValue: this.value
        }
    },
    methods: {
        handleInput(event) {
            this.$emit('input', event)
        }
    }
}

vue3中的 v-model

vue3中的v-model默认绑定的不是value,而是modelValue,接收的方法由input改为@update:modelValue。

<template>
  <child v-model="msg" />
  <p>{{msg}}</p>
</template>
 
<script lang="ts">
import { defineComponent,ref} from 'vue';
import child from './components/child/index.vue'
 
export default defineComponent({
  name: 'App',
  components:{
    child
  },
  setup(){
    const msg = ref('1')
    return{
      msg
    }
  }
});
</script>
<template>
    <input type="text" :value="modelValue" @input="onInput">
</template>
<script lang="ts">
import {defineComponent} from 'vue'
export default defineComponent({
    name:'ChildInput',
    props:{
        modelValue:{
            type:String
        }
    },
    setup(props, context){
        const onInput = (e: Event) =>{
            context.emit('update:modelValue',e.target.value)
        }
        return{
            onInput
        }
    }
})
</script>

到此这篇关于vue3 封装自定义组件v-model的文章就介绍到这了,更多相关vue3 自定义组件v-model内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue3.0在子组件中触发的父组件函数方式

    vue3.0在子组件中触发的父组件函数方式

    这篇文章主要介绍了vue3.0在子组件中触发的父组件函数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue3中使用Element-Plus的el-upload组件限制只上传一个文件的功能实现

    Vue3中使用Element-Plus的el-upload组件限制只上传一个文件的功能实现

    在 Vue 3 中使用 Element-Plus 的 el-upload 组件进行文件上传时,有时候需要限制只能上传一个文件,本文将介绍如何通过配置 el-upload 组件实现这个功能,让你的文件上传变得更加简洁和易用,需要的朋友可以参考下
    2023-10-10
  • Vue3+elementui plus创建项目的方法

    Vue3+elementui plus创建项目的方法

    这篇文章主要介绍了Vue3+elementui plus创建项目的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 详解vue如何获取当前系统时间

    详解vue如何获取当前系统时间

    这篇文章主要详细介绍了vue如何获取当前系统时间,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • vue cli安装使用less的教程详解

    vue cli安装使用less的教程详解

    这篇文章主要介绍了vue-cli安装使用less的教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 基于Vue3与免费满血版DeepSeek实现无限滚动+懒加载+瀑布流模块及优化过程

    基于Vue3与免费满血版DeepSeek实现无限滚动+懒加载+瀑布流模块及优化过程

    在进行非完全标准化数据的可视化展示时,瀑布流是一种经常被采用的展示方法,瀑布流能够有效地将不同大小规格的内容以一种相对规整的方式呈现出来,本文给大家介绍了基于Vue3与免费满血版DeepSeek实现无限滚动+懒加载+瀑布流模块,需要的朋友可以参考下
    2025-03-03
  • VUE div click无效的问题及解决

    VUE div click无效的问题及解决

    这篇文章主要介绍了VUE div click无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • vue使用axios上传文件(FormData)的方法

    vue使用axios上传文件(FormData)的方法

    这篇文章主要介绍了vue使用axios上传文件(FormData)的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue+mock.js实现前后端分离

    vue+mock.js实现前后端分离

    这篇文章主要为大家详细介绍了vue+mock.js实现前后端分离,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 如何在宝塔面板部署vue项目

    如何在宝塔面板部署vue项目

    这篇文章主要给大家介绍了关于如何在宝塔面板部署vue项目的相关资料,宝塔面板可以通过Nginx来部署Vue项目,并解决跨域问题,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论