Vue3封装input组件

第一步在components文件夹中 创建一个myInput.vue文件

	<template>
    <div>
        <input type="text" :value="modelValue" @input="iptChange">
    </div>
   </template>

<script>
import { ref } from 'vue'
export default {
    props: {
        modelValue: String // 这里要注意 vue2中 v-model在input框中使用其实就是v-bind:value 和 @input事件的组合
        // 但是在3.0中 绑定的值为modelValue 这也就是我这里问题产生的原因
    },
    //setup接收两个参数 第一个参数其实就是本页面中的props属性 不过这个参数不建议解构赋值,因为如果解构赋值会使数据失去响应式
    // 第二个参数是一个上下文对象 暴露了vue2中输入this的属性和方法解构大概是这样的
    <!--{ attrs: (...)
		emit: (...) 这里的emit可以实现在vue2中的 this.$emit的功能 只不过要更新v-model的数据需要使用update 类似于一千的sync修饰符的写法
		expose: exposed => {…}
		slots: (...)
		get attrs: ƒ attrs()
		get emit: emit() { return (event, ...args) => {…}
		get slots: ƒ slots()
		__proto__: Object
	}-->
    setup(props, ctx) {
        function iptChange(e) {
        	// ctx 这里通过emit来修改父组件中v-model的数据
            ctx.emit('update:modelValue', e.target.value)
        }
        return {
            iptChange
        }
    }
}
</script>

<style scoped>
</style>

在需要使用myInput的组件中

<template>
  <div class="home">
  
    <my-input v-model="content"></my-input>
  </div>
</template>

<script>
import myInput from '@/components/myInput'
import { ref, watchEffect } from 'vue'
export default {
  name: 'Home',
  components:{ // 这里使用了vue2的组件注册方法
    myInput
  },
  setup() {
    let content = ref('')
    watchEffect(() => { // watchEffect可以监听数据的变化 和watch的区别是不需要指定属性区监听
      console.log(content.value); 
    })
    return {
      content
    }
  }
}
</script>

补充说明

我们这个例子中使用的是 v-model=“content” 这种方法 在子组件中需要接受的值就是modelValue
如果你想修改一下接受的属性 可以这样写

 <my-input v-model:key="content"></my-input>

这样写的化我们就可以在子组件中的props中接收key属性也就是下面这种写法

<input :value="key"  @input="iptChange"/>
props: {
	key: String
}
// 当然这是修改的数据也就随之改变
setup(props, ctx) {
	 function iptChange(e) {
          ctx.emit('update:key', e.target.value)
      }
      return {
          iptChange
      }
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3中封装form表单组件的思路可以参考以下步骤: 1. 创建一个Form组件,作为整个表单的容器。该组件可以包含一个form元素,并接受一个表单数据对象作为props。 2. 在Form组件内部,使用v-for指令遍历表单数据对象的属性,并根据属性的类型渲染对应的表单项。 3. 对于每个表单项,可以创建一个FormItem组件,并根据属性的类型渲染对应的表单元素,比如input、select、textarea等。 4. FormItem组件可以接受属性的名称、类型和值作为props,并根据类型渲染不同的表单元素。 5. 可以根据需要扩展Form组件和FormItem组件,添加更多的表单项类型,比如富文本编辑器、上传图片等。 6. 在Form组件中,可以监听表单元素的值变化,并将变化的值更新到表单数据对象中。 7. 可以在Form组件中添加提交按钮,并在点击按钮时触发表单提交事件,将表单数据对象作为参数传递给父组件。 需要注意的是,这只是一个基本的封装思路,如果需要使用到更多的业务场景,可以根据具体需求进行扩展和定制。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* *2* [vue3 ts element plus form表单二次封装详细步骤 (附参数、类型详细介绍及简单使用示例)](https://blog.csdn.net/weixin_45291937/article/details/126275955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

彩色之外

你的打赏是我创作的氮气加速动力

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

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

打赏作者

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

抵扣说明:

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

余额充值