Невозможно заставить диалог vue.js element-ui работать, пока он находится внутри дочернего компонента

Вот родительский компонент:

<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 я получаю эту ошибку:

Старайтесь не изменять свойство напрямую, так как значение будет перезаписано при повторном рендеринге родительского компонента. Вместо этого используйте данные или вычисленное свойство на основе значения свойства. Изменяемая опора: "dialogVisible"

Позже я попытался поиграть и сделал что-то вроде ниже, но теперь я даже не могу открыть 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>

person Syed    schedule 26.03.2018    source источник


Ответы (1)


Если visible.sync работает, компонент генерирует update:visible событие.

Итак, чтобы не мутировать в дочернем элементе и вместо этого распространить событие на родительский элемент, а не:

:visible.sync="dialogVisible"

Do

: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>
person acdcjunior    schedule 26.03.2018
comment
Я постараюсь воспроизвести, дай мне секунду - person acdcjunior; 26.03.2018
comment
Но здесь stackoverflow.com/a/44287716/1292050 есть одна проблема, я изменил @visible-change="updateShowDialog" и использовал ваш код, и он сработал v-on:update:visible="updateShowDialog" или @:update:visible="updateShowDialog" - person Syed; 26.03.2018
comment
Нашел. Пожалуйста, проверьте обновленный ответ. Должно быть: :visible="dialogVisible", v-on:update:visible="visibleSync = $event" - person acdcjunior; 26.03.2018
comment
Я также добавил другую альтернативу, более короткую. - person acdcjunior; 26.03.2018