vue.js - 如何解决避免直接改变 prop,因为该值将被覆盖

标签 vue.js

我已经看到了很多问题和答案,但它们并没有解决我的问题,我只是试图显示/隐藏当我单击父组件菜单按钮时抽屉应该打开,首次加载后它可以工作很好,但是当我关闭它时,它会显示这个错误。我只想在 props 中传递 true 或 false

Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "drawer"

这就是我正在尝试做的事情。

在父级中

<template>
    <div @click="drawer = true" class="hamburger">
       <span></span>
       <span></span>
       <span></span>
    </div>

   <mobile-drawer-menu :drawer="drawer"/>
</template>

<script>
   import MobileDrawerMenu from "./MobileDrawerMenu";

   export default {
     components : {
        MobileDrawerMenu
    },

     data() {
        return {
            drawer : false,
        }
     },

   }
</script>

child

<template>
    <div v-if="drawer" class="fixed top-0 left-0 z-200">
        <div @click="drawer = false" class="overlay"></div>
        <div class="drawer-wrapper">
            <div class="drawer-close">
               <div class="flex items-center justify-end">
                  <svg @click="drawer = false"></svg>
               </div>
            </div>
        </div>
    </div>                     
</template>

<script>
   export default {
      name: "MobileDrawerMenu",
      props : {
        drawer : {
            type : Boolean,
            required : true
        }
     },
   }
</script>

最佳答案

您可以使用.sync modifier ,并使用 $emit 更新 prop:

<template>
    <div @click="drawer = true" class="hamburger">
       <span></span>
       <span></span>
       <span></span>
    </div>

   <mobile-drawer-menu :drawer.sync="drawer"/>
</template>

<script>
   import MobileDrawerMenu from "./MobileDrawerMenu";

   export default {
     components : {
        MobileDrawerMenu
    },

     data() {
        return {
            drawer : false,
        }
     },

   }
</script>

child

<template>
    <div v-if="drawer" class="fixed top-0 left-0 z-200">
        <div @click="$emit('update:drawer', false)" class="overlay"></div>
        <div class="drawer-wrapper">
            <div class="drawer-close">
               <div class="flex items-center justify-end">
                  <svg @click="$emit('update:drawer', false)"></svg>
               </div>
            </div>
        </div>
    </div>                     
</template>

<script>
   export default {
      name: "MobileDrawerMenu",
      props : {
        drawer : {
            type : Boolean,
            required : true
        }
     },
   }
</script>

JsFiddle:https://jsfiddle.net/hansfelix50/176oba9n/

关于vue.js - 如何解决避免直接改变 prop,因为该值将被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62009836/

相关文章:

vue.js - 如何在 vue 组件的 href 中添加条件?

javascript - 使用 VueJS 中的插槽访问其他组件中的组件数据

javascript - vue.js 中的 v-bind 错误

javascript - 有没有办法在这个 v-for 中正确使用索引而不出现错误

Nuxt JS 未定义 Firebase 存储 XMLHttpRequest 错误

css - 当使用 Vue.js 将文本设置为 "Completed"时,动态添加 css 类到 span 标记

vue.js - VueJS 基于角色的路由器身份验证

javascript - 在 Vue.js 中触发自定义 "change"事件是否安全?

javascript - Vuelidate 在页面加载时多次触发

javascript - Vue PWA : Use ServiceWorker to cache remote media assets from array of URLs