首页 > 其他分享 >Vue:实现子组件和父组件数据的双向绑定案例和sync修饰符简化

Vue:实现子组件和父组件数据的双向绑定案例和sync修饰符简化

时间:2024-03-29 10:59:59浏览次数:27  
标签:Vue 2px 修饰符 isShow sync vue 组件 BaseDialog

实现子组件和父组件数据的双向绑定 (实现App.vue中的selectId和子组件选中的数据进行双向绑定)

代码案例

BaseSelect.vue

<template>
  <div>
    <select :value="selectId" @change="selectCity">
      <option value="101">北京</option>
      <option value="102">上海</option>
      <option value="103">武汉</option>
      <option value="104">广州</option>
      <option value="105">深圳</option>
    </select>
  </div>
</template>

<script>
export default {
  props: {
    selectId: String,
  },
  methods: {
    selectCity(e) {
      this.$emit('changeCity', e.target.value)
    },
  },
}
</script>

<style>
</style>

App.vue

<template>
  <div class="app">
    <BaseSelect
      :selectId="selectId"
      @changeCity="selectId = $event"
    ></BaseSelect>
  </div>
</template>

<script>
import BaseSelect from './components/BaseSelect.vue'
export default {
  data() {
    return {
      selectId: '102',
    }
  },
  components: {
    BaseSelect,
  },
}
</script>

<style>
</style>

.sync修饰符(简化代码)

1.作用

可以实现 子组件父组件数据双向绑定,简化代码

简单理解:子组件可以修改父组件传过来的props值

2.场景

封装弹框类的基础组件, visible属性 true显示 false隐藏

3.本质

.sync修饰符 就是 :属性名@update:属性名 合写

4.语法

父组件

//.sync写法
<BaseDialog :visible.sync="isShow" />
--------------------------------------
//完整写法
<BaseDialog 
  :visible="isShow" 
  @update:visible="isShow = $event" 
/>

子组件

props: {
  visible: Boolean
},

this.$emit('update:visible', false)

代码示例

BaseDialog.vue
<template>
  <div class="base-dialog-wrap" v-show="isShow">
    <div class="base-dialog">
      <div class="title">
        <h3>温馨提示:</h3>
        <button class="close" @click="closeDialog">x</button>
      </div>
      <div class="content">
        <p>你确认要退出本系统么?</p>
      </div>
      <div class="footer">
        <button>确认</button>
        <button>取消</button>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    isShow: Boolean,
  },
  methods:{
    closeDialog(){
      this.$emit('update:isShow',false)
    }
  }
}
</script>

<style scoped>
.base-dialog-wrap {
  width: 300px;
  height: 200px;
  box-shadow: 2px 2px 2px 2px #ccc;
  position: fixed;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  padding: 0 10px;
}
.base-dialog .title {
  display: flex;
  justify-content: space-between;
  align-items: center;
  border-bottom: 2px solid #000;
}
.base-dialog .content {
  margin-top: 38px;
}
.base-dialog .title .close {
  width: 20px;
  height: 20px;
  cursor: pointer;
  line-height: 10px;
}
.footer {
  display: flex;
  justify-content: flex-end;
  margin-top: 26px;
}
.footer button {
  width: 80px;
  height: 40px;
}
.footer button:nth-child(1) {
  margin-right: 10px;
  cursor: pointer;
}
</style>
App.vue
<template>
  <div class="app">
    <button @click="openDialog">退出按钮</button>
    <!-- isShow.sync  => :isShow="isShow" @update:isShow="isShow=$event" -->
    <BaseDialog :isShow.sync="isShow"></BaseDialog>
  </div>
</template>

<script>
import BaseDialog from './components/BaseDialog.vue'
export default {
  data() {
    return {
      isShow: false,
    }
  },
  methods: {
    openDialog() {
      this.isShow = true
      // console.log(document.querySelectorAll('.box')); 
    },
  },
  components: {
    BaseDialog,
  },
}
</script>

<style>
</style>

标签:Vue,2px,修饰符,isShow,sync,vue,组件,BaseDialog
From: https://blog.csdn.net/weixin_45427648/article/details/137134481

相关文章

  • MybatisPlus多参数分页查询,黑马程序员SpringBoot3+Vue3教程第22集使用MP代替pagehelpe
    前言:视频来源1:黑马程序员SpringBoot3+Vue3全套视频教程,springboot+vue企业级全栈开发从基础、实战到面试一套通关视频来源2:黑马程序员最新MybatisPlus全套视频教程,4小时快速精通mybatis-plus框架创作理由:网上MP实现分页查询功能的帖子易读性太差,具体实现看下面。根据视频完成......
  • Vue+.Net6部署日记
    一.准备工作vue编译后以dist文件夹在iis新建一个网站,.Net6发布后同样的建站但是要注意把应用程序池设置为无托管模式二.配置反向代理IIS给前端方向代理需要以下两个组件:1.ARR2.Url重写;这两个组件都可以在www.iis.net搜到,在搜索栏输入关键词然后一个个找就好,先确保下......
  • 在vue中 使用v-if时它的响应式系统会作哪些优化
    前言:有时我们没在一个组件做初始化数据的工作,只是在template下的根元素加了个v-if控制显示,这样一来也能达到初始化数据的目的。但其背后的原理是什么? 在Vue2.x中,当你使用v-if指令将一个组件或元素的条件设置为false,使得它在DOM中不可见时,Vue的响应式系统会进行一些......
  • vue3项目数字金额转大写
    consttoUpperCaseAmount=(value)=>{ //将数字金额转换为大写的逻辑 constdigitUppercase=['零','壹','贰','叁','肆','伍','陆','柒','捌','玖']; constunit=[......
  • 免费分享一套SpringBoot+Vue个人健康管理系统,帅呆了~~
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot+Vue个人健康管理系统,分享下哈。项目视频演示【免费】SpringBoot+Vue个人健康管理系统Java毕业设计_哔哩哔哩_bilibili【免费】SpringBoot+Vue个人健康管理系统Java毕业设计项目来自互联网,免费开源分享,严禁商业。更多......
  • Java 多态、包、final、权限修饰符、静态代码块
    多态Java多态是指一个对象可以具有多种形态。它是面向对象编程的一个重要特性,允许子类对象可以被当作父类对象使用。多态的实现主要依赖于继承、接口和方法重写。在Java中,多态的实现主要通过以下两种方式:继承:子类继承父类的属性和方法,可以对方法进行重写(覆盖),从而实现不同的......
  • Ant Design Vue Tree 选中子节点同时半选中父级节点
    需要实现的效果:1、子菜单如果不是全部选中,一级菜单半选。2、子菜单全选,一级菜单选中。3、一级菜单选择,二级菜单全选。4、没有二级菜单,则只控制一级菜单。主要用到的属性是checked和halfCheckedKeys,通过手动控制那些菜单选中,那些半选中实现功能。**页面截图:**完整代码如......
  • 安装 Visual C++ 可再发行组件包的简单方法
    安装VisualC++RedistributablePackages的最佳方法安装对Wampserver(以及许多其他软件)至关重要的VC++可再发行组件的最简单、最简单、最不容易出错、最快的方法是使用一个程序,该程序通过单个可执行文件安装所需的所有内容。不,这不是乌托邦!它存在,它是名为VisualCppRedistA......
  • 基于vue.js的购物商场的设计与实现
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频https://graduation-images.oss-cn-beijing.aliyuncs.com/videos/828%E5%A5%97ssm%E5%BD%95%E5%83%8F/10773_ssm616%E5%9F%BA%E4%BA%8Evue.js%E7%9A%84%E8%B4%AD%E7%89%A9%E5%95%86%E5%9C%BA......
  • Ajax和django自带序列化组件
    Ajax和django自带序列化组件1.Ajax1.1Ajax介绍AJAX(AsynchronousJavascriptAndXML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。AJAX不是新的编程语言,而是一种使用现有标准的新方法......