v-model指令随记

开发项目的时候会使用element-ui的dialog组件,也会自己封装弹出框组件去完成项目需求,但总感觉自己的代码不够优雅,那么我们就根据el-dialog的组件用法去剖析他的实现方式,然后完善自己的自定义弹出框组件

自己写的
<!--components-->
<template>
    <div class="customDialog">
        <div class="overlay"></div>
        <div class="close" @click="$emit('hideDialog', false)"></div>
        <div class="dialogContent">
            <slot></slot>
        </div>
    </div>
</template>

<!--父组件-->
<template>
    <CustomDialog v-if="showDialog" @hideDialog="showDialog = false"></CustomDialog>
</template>
element-ui
<template>
    <el-dialog v-model="showDialog"></el-dialog>
</template>

element只用了v-model就实现了开关控制,而自己写的组件还要绑定自定义事件。观察发现问题可能出在v-model这个属性上,那么先去官网找找

// 摘自vue官网

// 自定义事件可以用于开发支持 v-model的自定义表单组件。回忆一下 v-model 在原生元素上的用法:
<input v-model="searchText" />

// 上面的代码其实等价于下面这段 (编译器会对 v-model 进行展开):
<input
  :value="searchText"
  @input="searchText = $event.target.value"
/>

完整demo代码如下

<CustomInput v-model="searchText" />


<!--conponent-->
<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue']
}
</script>

<template>
  <input
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  />
</template>

官网demo给我们演示了props数据的双向绑定, 那么改变思路,我们从内部调用v-model附带的自定义事件,也就实现了子组件对父组件数据的修改。然后就顺利完成项目需求

代码如下


<customScale v-model="show"></customScale>

<!--conponent-->
<template>
    <div class="customDialog">
        <div class="overlay"></div>
        <div class="close" @click="$emit('update:modelValue', false)"></div>
        <div class="dialogContent">
            <slot></slot>
        </div>
    </div>
</template>

平时的业务中遇到的父子组件双向数据绑定props的需求较少,这里暂不做更多探索,只实现简单的数据双向绑定 知道如果再遇到v-model 知道内部的实现原理就可以了。