Vue组件封装之封装v-model实现父子组件通讯

首先Vue 是单项数据流,v-model 只是语法糖

<input v-model="val" />		
等同于===>	<input :value="val" @input="val= $event.target.value" />

父组件

<template>
	<view class="box">
		<Son v-model="fatherValue"></Son>
	</view>
</template>

<script>
import Son from 'src/components/Son'
export default {
	components: { Son },
	data() {
		return {
			fatherValue: ''
		};
	},
	methods: {
	}
};
</script>

<style lang="scss" scoped>
</style>

子组件

<template>
	<view class="box">
		...
	</view>
</template>

<script>
export default {
	name: 'Son',
	model: {
		prop: 'value',
		//这个事件名可以随意写,它实际上是规定了子组件要更新父组件值需要注册的方法
		event: 'input'
	},
	props: {
		 value: {
			type: String,
			default: ''
		},
	},
	data() {
		return {
			currentValue: ''
		};
	},
	watch: {
		// 监听data值的变化,变化了就将新值传给父组件
		currentValue(newVal, oldVal) {
			this.$emit('input', newVal);
		}
	},
	methods: {
	}
};
</script>

<style lang="scss" scoped>
</style>

或者

<template>
	<view class="box">
		<input
			type="checkbox"
			@change="$emit('balabala', $event.target.checked)"
			:checked="value"
		/>
	</view>
</template>

<script>
export default {
	name: 'Son',
	model: {
		prop: 'checked',
		event: 'balabala'
	},
	props: {
		checked: {
			type: Boolean,
			default: false
		},
	},
	data() {
		return {
			currentValue: ''
		};
	},
};
</script>
好的,你的问题是关于Vue3和TypeScript结合使用Element Plus组件库进行图片上传并使用v-model进行值传递的问题。那么我来为你解答一下: 首先,在Vue3中,我们可以使用`<script setup>`语法来编写组件逻辑,这样可以更加简洁和易于理解。同时,使用TypeScript可以让我们在开发过程中更加规范和高效。 其次,对于Element Plus组件库的使用,我们可以通过`import`语句引入需要使用的组件。在图片上传组件中,我们可以使用`<el-upload>`组件来进行上传操作。同时,我们可以通过`v-model`来进行值的双向绑定,从而实现父子组件之间的数据传递。 下面是一个示例代码,供你参考: ```html <template> <el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/" :on-success="handleSuccess" :before-upload="beforeUpload" v-bind="$attrs" v-model="fileList" :auto-upload="false" > <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip"> 只能上传jpg/png文件,且不超过500kb </div> </el-upload> </template> <script setup lang="ts"> import { defineProps } from 'vue'; import { ElUpload } from 'element-plus'; interface UploadProps { value: any; onChange: (val: any) => void; } const props = defineProps<UploadProps>({ value: {}, onChange: () => {}, }); const fileList = props.value; const handleSuccess = (res: any, file: any) => { console.log(res, file); }; const beforeUpload = (file: any) => { const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt500Kb = file.size / 1024 < 500; if (!isJpgOrPng) { this.$message.error('只能上传jpg/png文件'); return false; } if (!isLt500Kb) { this.$message.error('文件大小不能超过500kb'); return false; } return true; }; watch( () => fileList, (newVal) => { props.onChange(newVal); } ); </script> ``` 在父组件中,我们可以使用`v-model`来进行值的双向绑定,如下所示: ```html <template> <div> <Upload v-model="imageUrl" /> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; import Upload from './Upload.vue'; const imageUrl = ref(''); </script> ``` 这样,当子组件中的值发生变化时,父组件中的`imageUrl`变量也会相应地更新。 希望这个回答能够帮助到你,如有疑问,欢迎继续追问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡小多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值