10-vue移动端项目(v-model的原理跟使用主要模仿在父组件定义一个值控制子组件的显示与隐藏)

本文详细介绍了Vue中组件的使用,特别是如何利用v-model实现组件的状态绑定。通过一个具体的示例,展示了如何在父组件App.vue与子组件mycom.vue间传递和更新状态,同时对封装vant组件的过程进行了阐述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在有一个父组件App.vue,它有一个子组件mycom.vue,并且这个mycom.vue中使用了vant组件(模拟的)

App.vue:
<template>
  <div>
    <h1>我 App.vue</h1>
    <!-- 需求:封装一个组件,这个组件的显示与隐藏是通过 v-model 传入的 show 属性来决定 -->
    <h2>1.0 v-model 的实现原理</h2>
    <button @click="show=true">点我显示组件</button>
    <!-- 需求:由于 channel 中有大量的逻辑代码,所以需要将popup封装为一个单独的组件 -->
    <h2>2.0 将 vant 中的组件进行封装</h2>
    <!-- <mycom :value="show" @input="e=>show=e" /> -->
    <!-- <mycom v-model="show" :myname="myname" @update:myname="e=>myname=e" /> -->
    <mycom v-model="show" :myname.sync="myname" />
  </div>
</template>

<script>
import mycom from './components/mycom'
export default {
  data () {
    return {
      show: false,
      myname: 'xjj'
    }
  },
  components: {
    mycom
  }
}
</script>
mycom.vue:
<template>
  <div>
      <!-- 将 vant 中的 mycom01 封装为组件 -->
      <h3>封装 mycom01 组件</h3>
      <!-- <vantCom v-model="value" /> -->
      <vantCom :value="value" @input="e=>$emit('input', e)" />
      <!-- 这里使用的 value 是从 App.vue 中传回的 -->
      <!-- 在 mycom 中被修改,是被 v-model 修改的 -->
      <!-- 将不应该将 value 在 App 中修改,而不是在这里 -->
      {{ myname }}
      <button @click="changeName">点我改 name</button>
  </div>
</template>

<script>
// 导入 vant 中的 mycom01
import vantCom from '../vant/01mycom'
export default {
  props: ['value', 'myname'],
//   methods: {
//     fn (e) {
//       this.value = e
//     }
//   },
  methods: {
      changeName () {
          this.$emit('update:myname', 'yjj')
      }
  },
  components: {
      vantCom
  }
}
</script>
vant文件夹里的01mycom.vue
<template>
  <div>
      <div v-if="value" @click="close" class="container">
        <div class="box"></div>
      </div>
  </div>
</template>

<script>
export default {
  props: ['value'],
  methods: {
    close () {
      // 将 value 设置为 false
      this.$emit('input', false)
    }
  }
}
</script>

<style scoped>
.container {
    width: 100%;
    height: 400px;
    background-color: rgba(0, 0, 0, .5);
    display: flex;
    justify-content: center;
    align-items: center;
}
.box {
    width: 200px;
    height: 200px;
    background-color: pink
}
</style>

效果演示:

点击按钮"点我显示组件"显示出弹出层,点击灰色的(模拟遮罩尘)弹出层消失
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值