iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue3父组件和子组件如何传值实例详解
  • 249
分享到

vue3父组件和子组件如何传值实例详解

摘要

目录1.父组件打开子组件的的dialog组件 2.父组件关闭子组件的的dialog组件3.开始运用: 用户的增加修改操作1.父组件的修改 2.子组件的修改3.父组

1.父组件打开子组件的的dialog组件

?新建一个Vue文件命名为test

?然后咱们直接从官网CV一个带有表单的dialog组件如下

 //子组件
<template>
  <el-dialog v-model="dialogFORMVisible" title="Shipping address">
    <el-form :model="form">
      <el-form-item label="Promotion name" :label-width="formLabelWidth">
        <el-input v-model="form.name" autocomplete="off" />
      </el-form-item>
      <el-form-item label="Zones" :label-width="formLabelWidth">
        <el-select v-model="form.region" placeholder="Please select a zone">
          <el-option label="Zone No.1" value="shanghai" />
          <el-option label="Zone No.2" value="beijing" />
        </el-select>
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogFormVisible = false">Cancel</el-button>
        <el-button type="primary" @click="dialogFormVisible = false"
        >Confirm</el-button
        >
      </span>
    </template>
  </el-dialog>
</template>
 
<script setup>
  import { Reactive, ref } from "vue";
 
  const formLabelWidth = '140px'
 
  const form = reactive({
    name: '',
    region: '',
    date1: '',
    date2: '',
    delivery: false,
    type: [],
    resource: '',
    desc: '',
  })
 
</script>
 
<style scoped>
  .el-button--text {
    margin-right: 15px;
  }
  .el-select {
    width: 300px;
  }
  .el-input {
    width: 300px;
  }
  .dialog-footer button:first-child {
    margin-right: 10px;
  }
</style>

?父组件就只需要一个按钮  然后加上咱们的点击事件

<template>
  <el-button type="primary" @click="handlerDialog"
  >添加用户
  </el-button>
  <test />
</template>
 
<script setup>
  import { reactive, ref } from "vue";
  import test from './test'
 
  const dialogFormVisible = ref(false)
 
  const handlerDialog = () => {
    dialogFormVisible.value = true
  }
</script>
 
<style scoped>
 
</style>

然后这个时候发现 弹窗怎么点就是出不来

 注意原因就是咱们的 dialogFormVisible.value值还没传给子组件 所以是打不开的

这个时候就要用到v-model进行数据绑定

所以父组件要进行修改 在test这里加上如下内容

<test v-model="dialogFormVisible"
        v-if="dialogFormVisible"/>

同样子组件也要修改 这里注意 是不能用v-model的  虽然官网的默认自带v-model     

但我们要作为子组件的话 vue3子组件是不能用v-model和父组件进行双向绑定的

那该怎么实现父子组件进行数据传递呢 咱们慢慢道来 咱们先实现父组件如何把dialogFormVisible的值传给子组件

其实很简单 在官网给的文档里面有这一行

017acdcf82af423da863e2c5be538e96.png

model-value 单向数据绑定

直接拿来CV到咱们的子组件上去

 <el-dialog :model-value="dialogFormVisible" title="Shipping address">

然后再去测试一下 可以了!!!

d67fa7a2e4e34215a1863e1186045c42.png

 2.父组件关闭子组件的的dialog组件

b0778dd930864520baab9d7ae80d7250.png

点击那个叉叉按钮可以关闭dialog组件  但是点击Cancel和Confirm按钮毫无反应

没错就是子组件没有传值到父组件上面去 所以!!! 重点来了

?defineEmits

子组件向父组件事件传递

通俗点就是子组件可以调用父组件的方法并且可以传参

所以在我们的子组件里面修改以下代码

<template>
  <el-dialog :model-value="dialogFormVisible" title="Shipping address">
    <el-form :model="form">
      <el-form-item label="Promotion name" :label-width="formLabelWidth">
        <el-input v-model="form.name" autocomplete="off" />
      </el-form-item>
      <el-form-item label="Zones" :label-width="formLabelWidth">
        <el-select v-model="form.region" placeholder="Please select a zone">
          <el-option label="Zone No.1" value="shanghai" />
          <el-option label="Zone No.2" value="beijing" />
        </el-select>
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        //加上关闭的点击事件
        <el-button @click="handleClose">Cancel</el-button>
        <el-button type="primary" @click="handleClose">Confirm</el-button
        >
      </span>
    </template>
  </el-dialog>
</template>
 
<script setup>
//记得引入defineEmits
  import { reactive, defineEmits,ref } from "vue";
 
//实例化defineEmits
 const emits = defineEmits(['update:modelValue'])
 
//关闭的点击事件
  const handleClose = () => {
    emits('update:modelValue', false)
  }
 
  const dialogFormVisible = ref(false)
 
  const formLabelWidth = '140px'
 
  const form = reactive({
    name: '',
    region: '',
    date1: '',
    date2: '',
    delivery: false,
    type: [],
    resource: '',
    desc: '',
  })
</script>
 
<style scoped>
  .el-button--text {
    margin-right: 15px;
  }
  .el-select {
    width: 300px;
  }
  .el-input {
    width: 300px;
  }
  .dialog-footer button:first-child {
    margin-right: 10px;
  }
</style>

然后再去试试 完美解决!!!

3.开始运用: 用户的增加修改操作

这个想必并不陌生 一般情况下便于维护 增加和修改操作都是在一个dialog上的

所以我们需要通过传入一个参数来区分我们进行的是添加用户还是修改用户 

修改用户还得向子组件传入咱们表格那一行的数据

所以咱们简化一下

如果是添加用户 就传一个字符串

如果是修改用户 就传一个对象过去

思路清晰 开始操作!!!

1.父组件的修改 

在添加用户按钮上修改如下

  <el-button type="primary" @click="handlerDialog('添加用户')"
      >添加用户
      </el-button>

修改按钮这里就要用到自己的表格数据了 

  <template #default="{ row }" v-else-if="item.prop==='action'">
     <el-button type="primary" @click="handlerDialog(row)" :icon="Edit"/>
 </template>

解释一下 这里是elementplus的表格的自定义列 有疑惑的可以参考官网文档

 然后在修改点击事件handlerDialog

 const handlerDialog = (row) => {
 
    if(row==='添加用户'){
      dialogTitile.value = "添加用户"
      dialogTableValue.value = {}
    }else{
      dialogTitile.value = "修改用户"
      console.log(row)
      dialogTableValue.value = JSON.parse(jsON.stringify(row))
 
    }
    dialogFormVisible.value = true
  }

说明一下 JSON.stringify() 系列化对象

系列化对象说白了就是把对象的类型转换为字符串类型

最后 发现这里给子组件是传入了俩个参数

所以 我们要去给父组件绑定上

  <test v-model="dialogFormVisible"
        v-if="dialogFormVisible"
        :dialogTitile="dialogTitile"
        :dialogTableValue="dialogTableValue"
  />

2.子组件的修改

父组件给子组件需要一个插件

?defineProps:父组件给子组件传值

加入以下方法 别忘了导入defineProps

 import {  defineProps } from 'vue' 
//接受父组件的值
  const props = defineProps({
    dialogTitile: {
      type: String,
      default: '',
      required: true
    },
    dialogTableValue:{
      type:Object,
      default: ()=>{},
    }
 
  })

这个时候添加用户的操作已经完成了

修改用户这块父组件已经传过来值了 接下来开始赋值操作

3.父组件给子组件赋值

?这时候需要一个监听

所以我们要导入一个watch

import { watch } from 'vue'
watch(()=>props.dialogTableValue,()=>{
   form.value = props.dialogTableValue.value
},{deep:true,immediate:true})

 props是我们创建出来的实例 在defineProps那一块

form.value = props.dialogTableValue.value 是将我们父组件的dialogTableValue传给form对象

这时候再去测试以下 已经没问题了!!!

父组件传过来的值里面还有一个 dialogTitile 

我们知道修改用户的密码话在实际中是不能修改的

所以咱们一不做二不休

只需要修改一下form表单 加上一个v-if

<el-form-item label="密码" :label-width="formLabelWidth" prop="passWord" v-if="dialogTitile==='添加用户'">
        <el-input v-model="form.password" name="password" type="password" show-password/>
 </el-form-item>

4.子组件调用父组件方法

论异步 咱们就要异步到底 在添加用户和修改用户之后 我们可以调用父组件的更新表格内容的方法

在这里我是  initUserList  小伙伴就调用自己的就好了

所以最后 修改dialog的提交按钮如下

 const emits = defineEmits(['update:modelValue','initUserList']) 
 
const handleConfirm = () => {
    formref.value.validate(async (valid) => {
      if (valid) {
        props.dialogTitile==='添加用户' ? await adduser(form.value) : await editUser(form.value)
        props.dialogTitile==='添加用户' ? ElMessage.success("添加成功"):ElMessage.success("修改成功")
        emits('initUserList')
        handleClose()
      } else {
        props.dialogTitile==='添加用户' ? ElMessage.error('"添加失败'):ElMessage.success("修改失败")
        return false
      }
    })
 
  }

完结撒花???

总结

到此这篇关于vue3父组件和子组件如何传值的文章就介绍到这了,更多相关vue3父组件和子组件传值内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue3父组件和子组件如何传值实例详解

本文链接: https://www.lsjlt.com/news/171728.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue3父组件和子组件如何传值实例详解
    目录1.父组件打开子组件的的dialog组件 2.父组件关闭子组件的的dialog组件3.开始运用: 用户的增加修改操作1.父组件的修改 2.子组件的修改3.父组...
    99+
    2022-11-13
    vue3 父子组件传值 vue3子组件给父组件传值 vue3.0父子组件传值
  • vue3 父子组件传值详解
    现在距离vue3的诞生已经过了很长时间了,笔者也是近期才开始学习vue3。对比vue2来看,vue3在写法发生了不小的变化,最典型的例子就是vue3通过ref,或者reactive实...
    99+
    2024-04-02
  • 详解vue3中的非父子组件传值
    目录App.vuesub1.vuesub2.vue总结 vue2中非父子组件的传值主要是通过事件总线,创建一个vue实例,通过在不同的组件中导入该实例来实现非父子组件之间的通信行...
    99+
    2024-04-02
  • vue3中非父子组件如何传值
    小编给大家分享一下vue3中非父子组件如何传值,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!vue2中非父子组件的传值主要是通过事件总线,创建一个vue实例,通过在不同的组件中导入该实例来实现非父子组件之间的通信行为。vu...
    99+
    2023-06-22
  • vue父组件如何向子组件传值
    vue父组件向子组件传值的方法:vue父组件是通过props向子组件传值的,示例如下:父组件调用子组件时,绑定动态属性。<v-header :title='title' :homemsg='...
    99+
    2024-04-02
  • vue中父组件如何给子组件传值
    小编给大家分享一下vue中父组件如何给子组件传值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一般情况下我们父子之间的传值用的是...
    99+
    2024-04-02
  • vue如何实现父子组件传值
    小编给大家分享一下vue如何实现父子组件传值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!父子组件传值<!DOCTYPE&...
    99+
    2024-04-02
  • Vue中子组件向父组件传值$emit、.sync的案例详解
    目录父组件子组件案例父组件子组件v-model首先我们可先了解一个父组件向子组件传值的一个案例:将父组件请求的后端数据传值给子组件props 因为通过属性传值是单向的,有时候我们需要...
    99+
    2024-04-02
  • vue3 父子组件间相互传值方式
    目录vue3父子组件相互传值父向子传值子组件向父组件传值vue3父子组件传值的注意事项解决办法:两种vue3父子组件相互传值 父向子传值 父 <pie-chart :pieDa...
    99+
    2024-04-02
  • vue父子组件间如何传值
    本文小编为大家详细介绍“vue父子组件间如何传值”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue父子组件间如何传值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。父组件传递方法首先,在Vue中父组件向子组件传...
    99+
    2023-07-06
  • vue如何实现父组件向子组件进行传值
    这篇文章给大家分享的是有关vue如何实现父组件向子组件进行传值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。父组件向子组件进行传值:在子组件绑定父的数据,子组件通过props接受参数。接下来我们通过一个例子,说明...
    99+
    2023-06-17
  • vue如何实现子组件向父组件进行传值
    这篇文章主要为大家展示了“vue如何实现子组件向父组件进行传值”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现子组件向父组件进行传值”这篇文章吧。子组件向父组件进行传值:父组件内设置...
    99+
    2023-06-17
  • Vue中如何实现父子组件传值
    Vue中如何实现父子组件传值,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(一)传递数值1.子组件:Header.vue<templat...
    99+
    2024-04-02
  • Vue中父子组件如何实现传值
    目录前言一、将子组件引入父组件二、父组件如何传值给子组件三、子组件如何接收父组件传过来的值并使用(props)四、子组件如何传值给父组件($emit)五、父组件使用子组件传过来的值总...
    99+
    2023-01-28
    Vue父子组件 Vue组件传值 Vue父子组件传值
  • uniapp组件传值的方法(父传子,子传父,对象传值)实战案例
    目录前言父组件给子组件传值子组件给父组件传值父组件给父组件传对象值总结 前言 最近看到uniapp组件传值的方法,这里记录一下,学过vue的应该都觉得很简单,传值的方法基本...
    99+
    2023-03-01
    uniapp 组件传值 uniapp如何使用组件的值 uniapp组件传值实例
  • uni-app小程序中父组件和子组件传值的实现实例
    目录前言一、父组件向子组件传值二、子组件向父组件传值总结前言 1、父组件向子组件传值 → 通过数据绑定 2、子组件向父组件传值 → 通过事件 一、父组件向子组件传...
    99+
    2022-11-13
    uniapp父组件向子组件传值 uniapp父子组件传值 小程序父子组件传值
  • vue3 非父子组件通信详解
    目录第一种方法App.vueHome.vueHomeContent.vue数据的响应式修改响应式Property总结业务场景是,不是父子组件实现通信 文件目录 第一种方法 Ap...
    99+
    2024-04-02
  • 详解React 父组件和子组件的数据传输
    目录一、父组件向子组件传递数据 1.1、父组件代码1.2、子组件代码二、子组件向父组件传输数据 2.1、父组件代码 2.2、子组件代码 在学习 React 框架组件间数据传输知识点前...
    99+
    2024-04-02
  • Vue3中怎么修改父组件传递到子组件中的值
    这篇文章主要介绍了Vue3中怎么修改父组件传递到子组件中的值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue3中怎么修改父组件传递到子组件中的值文章都会有所收获,下面我们一起来看看吧。自定义组件上使用v-m...
    99+
    2023-07-06
  • Angular5.0 子组件如何通过service传递值给父组件
    这篇文章主要为大家展示了“Angular5.0 子组件如何通过service传递值给父组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Angular5.0 子...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作