最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3父組件和子組件如何傳值實例詳解

 更新時間:2022年08月04日 09:26:54   作者:湘鍋鍋  
近期學習vue3的父子組件之間的傳值,發(fā)現(xiàn)跟vue2.x的父子組件之間的傳值并沒有太大的區(qū)別,下面這篇文章主要給大家介紹了關(guān)于vue3父組件和子組件如何傳值的相關(guān)資料,需要的朋友可以參考下

1.父組件打開子組件的的dialog組件

??新建一個vue文件命名為test

??然后咱們直接從官網(wǎng)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>

然后這個時候發(fā)現(xiàn) 彈窗怎么點就是出不來

 注意原因就是咱們的 dialogFormVisible.value值還沒傳給子組件 所以是打不開的

這個時候就要用到v-model進行數(shù)據(jù)綁定

所以父組件要進行修改 在test這里加上如下內(nèi)容

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

同樣子組件也要修改 這里注意 是不能用v-model的  雖然官網(wǎng)的默認自帶v-model     

但我們要作為子組件的話 vue3子組件是不能用v-model和父組件進行雙向綁定的

那該怎么實現(xiàn)父子組件進行數(shù)據(jù)傳遞呢 咱們慢慢道來 咱們先實現(xiàn)父組件如何把dialogFormVisible的值傳給子組件

其實很簡單 在官網(wǎng)給的文檔里面有這一行

017acdcf82af423da863e2c5be538e96.png

model-value 單向數(shù)據(jù)綁定

直接拿來CV到咱們的子組件上去

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

然后再去測試一下 可以了?。。?/p>

d67fa7a2e4e34215a1863e1186045c42.png

 2.父組件關(guān)閉子組件的的dialog組件

b0778dd930864520baab9d7ae80d7250.png

點擊那個叉叉按鈕可以關(guān)閉dialog組件  但是點擊Cancel和Confirm按鈕毫無反應(yīng)

沒錯就是子組件沒有傳值到父組件上面去 所以?。?! 重點來了

??defineEmits

子組件向父組件事件傳遞

通俗點就是子組件可以調(diào)用父組件的方法并且可以傳參

所以在我們的子組件里面修改以下代碼

<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">
        //加上關(guān)閉的點擊事件
        <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'])
 
//關(guān)閉的點擊事件
  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>

然后再去試試 完美解決?。。?/p>

3.開始運用: 用戶的增加修改操作

這個想必并不陌生 一般情況下便于維護 增加和修改操作都是在一個dialog上的

所以我們需要通過傳入一個參數(shù)來區(qū)分我們進行的是添加用戶還是修改用戶 

修改用戶還得向子組件傳入咱們表格那一行的數(shù)據(jù)

所以咱們簡化一下

如果是添加用戶 就傳一個字符串

如果是修改用戶 就傳一個對象過去

思路清晰 開始操作?。。?/p>

1.父組件的修改 

在添加用戶按鈕上修改如下

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

修改按鈕這里就要用到自己的表格數(shù)據(jù)了 

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

解釋一下 這里是elementplus的表格的自定義列 有疑惑的可以參考官網(wǎng)文檔

 然后在修改點擊事件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() 系列化對象

系列化對象說白了就是把對象的類型轉(zhuǎn)換為字符串類型

最后 發(fā)現(xiàn)這里給子組件是傳入了倆個參數(shù)

所以 我們要去給父組件綁定上

  <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: ()=>{},
    }
 
  })

這個時候添加用戶的操作已經(jīng)完成了

修改用戶這塊父組件已經(jīng)傳過來值了 接下來開始賦值操作

3.父組件給子組件賦值

??這時候需要一個監(jiān)聽

所以我們要導入一個watch

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

 props是我們創(chuàng)建出來的實例 在defineProps那一塊

form.value = props.dialogTableValue.value 是將我們父組件的dialogTableValue傳給form對象

這時候再去測試以下 已經(jīng)沒問題了?。?!

父組件傳過來的值里面還有一個 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.子組件調(diào)用父組件方法

論異步 咱們就要異步到底 在添加用戶和修改用戶之后 我們可以調(diào)用父組件的更新表格內(nèi)容的方法

在這里我是  initUserList  小伙伴就調(diào)用自己的就好了

所以最后 修改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
      }
    })
 
  }

完結(jié)撒花??????

總結(jié)

到此這篇關(guān)于vue3父組件和子組件如何傳值的文章就介紹到這了,更多相關(guān)vue3父組件和子組件傳值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue+elementui(對話框中form表單的reset問題)

    vue+elementui(對話框中form表單的reset問題)

    這篇文章主要介紹了vue+elementui(對話框中form表單的reset問題),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Vite使用Esbuild提升性能詳解

    Vite使用Esbuild提升性能詳解

    這篇文章主要為大家介紹了Vite使用Esbuild提升性能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • vue項目,代碼提交至碼云,iconfont的用法說明

    vue項目,代碼提交至碼云,iconfont的用法說明

    這篇文章主要介紹了vue項目,代碼提交至碼云,iconfont的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • web項目開發(fā)中2個Token原因解析及示例代碼

    web項目開發(fā)中2個Token原因解析及示例代碼

    這篇文章主要介紹了web項目開發(fā)中會出現(xiàn)2個Token原因的解析以及實現(xiàn)的示例代碼,有需要的同學可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • vue使用動態(tài)組件實現(xiàn)TAB切換效果

    vue使用動態(tài)組件實現(xiàn)TAB切換效果

    這篇文章主要介紹了vue使用動態(tài)組件實現(xiàn)TAB切換效果的方法,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下
    2021-05-05
  • Vue.set與this.$set的用法與使用場景介紹

    Vue.set與this.$set的用法與使用場景介紹

    Vue.set()和this.$set()這兩個api的實現(xiàn)原理基本一模一樣,都是使用了set函數(shù),下面這篇文章主要給大家介紹了關(guān)于Vue.set與this.$set的用法與使用場景,需要的朋友可以參考下
    2022-03-03
  • vue播放flv、m3u8視頻流(監(jiān)控)的方法實例

    vue播放flv、m3u8視頻流(監(jiān)控)的方法實例

    隨著前端大屏頁面的逐漸壯大,客戶的...其中實時播放監(jiān)控的需求逐步增加,視頻流格式也是有很多種,用到最多的.flv、.m3u8,下面這篇文章主要給大家介紹了關(guān)于vue播放flv、m3u8視頻流(監(jiān)控)的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Vue中methods的this指向問題淺析

    Vue中methods的this指向問題淺析

    相信我們寫Vue代碼時肯定都會在methods中用過this這個關(guān)鍵字,甚至還打印過this查看其內(nèi)容。最終發(fā)現(xiàn)該實例對象竟然是我們的Vue實例對象
    2022-10-10
  • bootstrap vue.js實現(xiàn)tab效果

    bootstrap vue.js實現(xiàn)tab效果

    這篇文章主要為大家詳細介紹了bootstrap vue.js實現(xiàn)tab效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • vue如何使用vue slot封裝公共組件

    vue如何使用vue slot封裝公共組件

    這篇文章主要介紹了vue如何使用vue slot封裝公共組件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論

正镶白旗| 肥西县| 乌鲁木齐县| 香港| 中西区| 江达县| 阜宁县| 麻江县| 大荔县| 阿巴嘎旗| 江陵县| 渝北区| 五家渠市| 志丹县| 巴楚县| 银川市| 广河县| 青龙| 崇信县| 邳州市| 宜兴市| 观塘区| 华池县| 榕江县| 陆河县| 贡山| 林周县| 嘉荫县| 重庆市| 凤城市| 阳春市| 林芝县| 铁力市| 枣阳市| 伊通| 新泰市| 遂平县| 盐源县| 建宁县| 遵义市| 息烽县|