Vue3 v-model 之 开端

996 阅读2分钟

Vue3 中 的props和v-model

假设 子组件需要接受父组件的参数(非常常见

下面的例子中,该参数定义为visible,是个布尔值

组件中定义了props 形如

<template>
        <div > 一些文本 {{visible}} </div>
</template>

<script lang="ts">
export default {
props: {
    visible: {  type: Boolean, default: false, }         // 定义了props
    }           }
 <script >

组件

<template>
< :visible="x" />   //使用子组件-->传入 子 想要的props 也就是X 
</template>

<script lang="ts">

importfrom "./lib/子.vue"
import { ref } from 'vue';

export default {     components: { 子 },        // 声明 使用 子组件
setup() {
    const x = ref(false);            //定义了数据X 
    return {x} }      }
<script >

因为父组件中使用子组件时声明了 :visible="X"

子组件拿到数据X

此时单向数据流


让我们利用这个数据做点事情-->决定子组件显示的问题

template外面再套个template并使用v-if    //Vue3 可以多个根元素

<template v-if="visible">
    <template>
        <div > 一些文本{{visible}} </div>
    </template>
</template>

这个时候再进一步,我想改变这个X

我要在父元素中添加按钮 ,toggle一下这个visible-->控制子的显示

依旧是单向数据流

父里加个button 加个事件 使用toggle函数
<template>
    <子 :visible="x" />
    <button  @click='toggle' />   ///新加的
</template>


export default {     
setup() {
  const x = ref(false);  
  
   const toggle = () => { x.value = !x.value; };      ///新加的
   
   return {x}   } }
<script >

最终在父组件实现了开关

子根据父传入的props(x)改变--> 父里可以改x -->子响应的改变


再前进一步! 我要实现双向影响

要在子里面-->点击自己就关闭自己(非常常见

但是不能改外面的props (子通知父-->父去改)

子组件使用 emit 触发父组件的自定义事件。

<template v-if="visible">
    <template>
        <div > 一些文本{{visible}} </div>
        <div @click="关闭我自己" > 一些一些文本{{visible}} </div>    // 加监听和对应方法
    </template>
</template>

<script lang="ts">
export default {
props: {
    visible: {  type: Boolean, default: false, }         
    },   
    
setup(props, context) {
   const 关闭我自己 = () => {
   
   context.emit('update:visible', false)   } // 方法写在这

   return {关闭我自己}  
    }
 <script >

父里加个button 加个事件 使用toggle函数
<template>
    < :visible="x"    @update:visible="x = $event"  />                     ///新加的
    <button  @click='toggle' />  
</template>

<script lang="ts" >
export default {     
setup() {
  const x = ref(false);  
  
   const toggle = () => { x.value = !x.value; };  
   
   return {x}   } }
</script >

技术总结

子 “关闭我自己”调用了

context.emit('update:visible', false)   //传给父事件名:值

父监听

 <子:visible="x"    @update:visible="x = $event"  />   //监听那个事件并且获取那个值-->$event
 v-mdodel简写
 <子  v-mdodel:visible="x" /> 

v-mdodel就是语法糖 但是来源要清楚