vue3、element plus自定义组件

1、自定义组件绑定v-model。在自定义组件上绑定v-model,在组件内部被展开成两个部分:

/**
*组件使用处代码,别忘了引入
*/
<bus-selector v-model="searchForm.bus" />


/**
*组件内代码
*/
<template>
    <!-- handlerChanged($event) -->
    <!-- $emit('update:modelValue', $event) -->
    <el-select 
        v-model="selectValue"
        clearable
        filterable
        @change="$emit('update:modelValue', selectValue)" 
        value-key="id"
        placeholder="请选择车辆">
            <el-option v-for="item in options" :key="item.id" :label="item.outerPlate" :value="item" />
    </el-select>
</template>
  
<script lang="ts" setup>
import { ref, onMounted, type Ref, toRefs,onUpdated } from 'vue';
import axios from 'axios';
import { httpErrBox } from '@/tools/CommonTool';
import { Bus } from '@/clas/Bus';


//接收父组件v-model传递过来的值,并引入修改方法update:modelValue
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])

//el-select的v-model不能绑定prop属性,所以定义本地变量一个
//并且change事件中需要将这个值传递给更新方法,即update:modelValue
const selectValue = ref(props.modelValue);
//加入下面这行代码,是为了解决选择改变后显示不更新的问题
onUpdated(()=>{
    selectValue.value = props.modelValue;
})

//定义数据源,并从服务器获取数据
let options = ref(new Array<Bus>);
onMounted(()=>axios.get("/api/bus/all")
    .then(response=>{
        options.value = response.data;
    }).catch(err=>{
        httpErrBox(err,"加载Bus选择器数据出错")
    }))

</script>

### 创建自定义表单组件Vue 3Element Plus 中实现自定义表单组件涉及多个方面,包括但不限于父子组件通信、`props` 属性的使用、`emits` 事件的处理以及 `watch` 数据变化监听。 #### 使用 Props 进行属性传递 为了使父级能够向子级传递配置信息和其他必要的参数,可以利用 `props` 来完成这一过程。通过这种方式,可以让同一个组件适应不同的业务场景而无需重复编写大量相似代码[^1]。 ```javascript // 子组件接收来自父组件的数据作为 props export default { props: { modelValue: Object, rules: Array, fields: Array } } ``` #### 发射 Events 实现双向绑定 为了让父级能接收到子级的变化通知并更新状态,通常采用发射事件的方式,在此情况下推荐使用 `v-model` 或者直接指定特定名称的事件如 `update:model-value` 来保持一致性。 ```html <!--组件 --> <CustomForm v-model="formData"></CustomForm> <script> import CustomForm from &#39;./components/CustomForm.vue&#39;; export default { components: { CustomForm }, data() { return { formData: {} }; } }; </script> ``` #### Watcher 监听数据变动 对于某些特殊需求来说,可能还需要监控内部状态改变以便执行额外操作,比如清除旧有的错误提示或是初始化默认值等。此时可以通过设置 watcher 达成目的[^4]。 ```javascript setup(props, context) { const formRef = ref(null); watch( () => props.modelValue, (newValue) => { if (!Object.keys(newValue).length && formRef.value) { formRef.value.resetFields(); } }, { deep: true } ); return { formRef }; } ``` #### 封装公共接口提高复用率 考虑到实际项目中的复杂度,建议尽可能多地抽象出共通部分形成独立模块供其他地方调用,这样不仅有助于减少冗余还能增强系统的灵活性和维护性[^2]。 ```typescript interface FormFieldConfig { label?: string; type?: string; prop?: string; required?: boolean; message?: string; trigger?: "blur" | "change"; } const useFormGenerator = ( config: FormFieldConfig[], onSubmit: Function ): JSX.Element[] => { // ... generate elements based on configuration ... }; // Usage example within a component template or render function. {useFormGenerator(fields, handleSubmit)} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值