【问题标题】:Cannot make vue.js element-ui's dialog work while it's inside a child component无法使 vue.js element-ui 对话框在子组件中工作
【发布时间】:2018-09-05 00:43:36
【问题描述】:

这里是父组件:

<template lang="pug">
  .wrapper
    el-button(type="primary", @click="dialogAddUser = true") New User
    hr
    // Dialog: Add User
    add-edit-user(:dialog-visible.sync="dialogAddUser")
</template>

<script>
import * as data from '@/components/partials/data'
import AddUser from './partials/AddUser'

export default {
  name: 'users',
  components: { AddUser },

  data () {
    return {
      users: data.users,
      dialogAddUser: false
    }
  }
}
</script>

这是子组件:

<template lang="pug">
  el-dialog(width="75%", title="New User", :visible.sync="dialogVisible", top="5vh")
    div 'el-dialog-body' - content goes here
</template>

<script>
  export default {
    name: 'add-user',
    props: {
      dialogVisible: Boolean
    }
  }
</script>

我可以打开dialog,但是当使用dialog 内的右上角按钮关闭对话框时,我收到此错误:

避免直接改变prop,因为值会被覆盖 每当父组件重新渲染时。相反,使用数据或 基于道具值的计算属性。道具被变异: “对话可见”

后来我尝试玩并做了类似下面的操作,但现在我什至无法打开dialog

<template lang="pug">
  el-dialog(width="75%", title="New User", :visible.sync="visibleSync", top="5vh")
    div 'el-dialog-body' - content goes here 
</template>

<script>
  export default {
    name: 'add-user',
    props: {
      dialogVisible: Boolean
    },
    watch: {
      visibleSync (val) {
        this.$emit('update:dialogVisible', val)
      }
    },
    data () {
      return {
        visibleSync: this.dialogVisible
      }
    }
  }
</script>

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component element-ui


    【解决方案1】:

    如果visible.sync 有效,则组件正在发出update:visible 事件。

    因此,不要在子节点中发生变异,而是将事件传播给父节点,而不是:

    :visible.sync="dialogVisible"
    

    :visible="dialogVisible", v-on:update:visible="visibleSync = $event"
    

    完整代码:

    <template lang="pug">
      el-dialog(width="75%", title="New User", :visible="dialogVisible", v-on:update:visible="visibleSync = $event", top="5vh")
        div 'el-dialog-body' - content goes here 
    </template>
    
    <script>
      export default {
        name: 'add-user',
        props: {
          dialogVisible: Boolean
        },
        watch: {
          visibleSync (val) {
            this.$emit('update:dialogVisible', val)
          }
        },
        data () {
          return {
            visibleSync: this.dialogVisible
          }
        }
      }
    </script>
    

    作为另一种选择,您可以直接从 v-on 侦听器发出,而无需 visibleSync 本地属性:

    <template lang="pug">
      el-dialog(width="75%", title="New User", :visible="dialogVisible", v-on:update:visible="$emit('update:dialogVisible', $event)", top="5vh")
        div 'el-dialog-body' - content goes here 
    </template>
    
    <script>
      export default {
        name: 'add-user',
        props: {
          dialogVisible: Boolean
        }
      }
    </script>
    

    【讨论】:

    • 我会尝试重现,给我一秒钟
    • 但是这里stackoverflow.com/a/44287716/1292050 有一个问题,我更改了@visible-change="updateShowDialog" 并使用了您的代码,它可以工作v-on:update:visible="updateShowDialog"@:update:visible="updateShowDialog"
    • 找到了。请检查更新的答案。应该是::visible="dialogVisible", v-on:update:visible="visibleSync = $event"
    • 我还添加了另一种选择,更短。
    猜你喜欢
    • 2020-08-07
    • 2020-03-13
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多