【发布时间】:2018-05-31 08:46:47
【问题描述】:
目前我正在学习 VueJS,我正在使用 http://vuematerial.io。
我已经构建了一个包含多个页面的应用程序 - 每个页面都包含一个侧边栏(抽屉组件 https://vuematerial.io/components/drawer)。
由于我不想在每个页面中一遍又一遍地复制和粘贴相同的抽屉组件代码,我只想创建一个侧边栏组件,然后将其导入每个页面。
到目前为止,一切都很好。
这工作正常。
但是现在 - 我希望能够打开和关闭侧边栏。 就在之前,当组件直接在页面中时,这很容易 - 只是一个带有布尔值的变量赋值来显示或隐藏侧边栏。 但是现在,对我来说,在组件上同步属性似乎非常困难。
让我向您展示当前的新代码以澄清问题所在:
所以,这是页面组件:
<md-toolbar class="md-primary">
<md-button class="md-icon-button" @click="showSidebar=true">
<md-icon>menu</md-icon>
</md-button><span class="md-title">Dashboard</span>
</md-toolbar>
<Sidebar v-bind:showSidebar="showSidebar"></Sidebar>
这就是 Vue 结构 - 你可以看到 - 我想绑定 showSidebar 属性。 这就是我在页面中实现它的方式
import Sidebar from './sidebar.vue';
export default {
data: function () {
return {
showSidebar: false
}
},
components: {
Sidebar: Sidebar
},
现在是侧边栏组件本身:
<md-drawer v-bind:md-active.sync="showSidebar">
侧边栏组件然后通过这样的属性获取值:
export default {
name: 'sidebar',
props: ['showSidebar'],
这似乎有效! 我可以单击页面上的菜单按钮,将属性设置为 true - 侧边栏就会显示!伟大的!但是.. 当我在此侧边栏外部单击时,会出现此警告消息 - 而且 - 此外 - 我无法在新点击时再次重新打开它。它关闭了,但我无法再次打开它,直到我完全重新加载页面。
我怎样才能解决这个问题? 我也考虑过使用事件,因为抽屉组件似乎在监听事件,但我没有成功。 这是抽屉组件的当前代码:https://github.com/vuematerial/vue-material/blob/dev/src/components/MdDrawer/MdDrawer.vue
我希望很清楚,我的问题是什么。
我希望,任何人都可以帮助我。
这是我在这里的第一个问题 - 所以请善待:)
/编辑: 哎呀,这是警告消息:
[Vue warn]: 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: "showSidebar"
【问题讨论】:
-
“这个警告信息” - 什么警告信息?认为您忘记将其粘贴到 :-)
-
谢谢@cjs1978 - 我已经编辑过了。这就是消息:`` [Vue 警告]:避免直接改变一个 prop,因为只要父组件重新渲染,该值就会被覆盖。相反,使用基于道具值的数据或计算属性。正在变异的道具:“showSidebar” ``
-
很难从您的代码中看出您在哪里/如何将“showSidebar”再次设置为 false(为了隐藏它)。至于警告信息,请检查:stackoverflow.com/questions/39868963/…
-
谢谢。该值似乎直接从 MdDrawer 组件本身设置为 false (看看我发布的源代码)。所以,这会覆盖我的财产——我收到了这条消息。似乎有逻辑。我想要实现的是,我可以在页面内打开和关闭侧边栏。 MdDrawer 将变量设置为 false - 所以也许我只需要发出一些事件来强制打开或关闭。组件似乎在监听事件(请查看源代码):)
标签: javascript vue.js components material-design drawer