Javascript Vue.js中的动态导航组件

Javascript Vue.js中的动态导航组件,javascript,vue.js,Javascript,Vue.js,其思想是在Vue实例中使用“isActive”布尔数组,以便在每次加载导航栏时更新它,即使用从URL获取的当前页面名称作为数组中的索引,并将其值设置为true;和“onbeforeunload”将其设置为false 导航栏 从“Vue”导入Vue var NAVBROPTS={ 名称:“导航栏”, 资料{ 返回{ isActive:[] } } }) module.exports=导航栏 函数pageName(pathname){}//不返回带空格的字符串 var currentP

其思想是在Vue实例中使用“isActive”布尔数组,以便在每次加载导航栏时更新它,即使用从URL获取的当前页面名称作为数组中的索引,并将其值设置为true;和“onbeforeunload”将其设置为false

导航栏


从“Vue”导入Vue var NAVBROPTS={ 名称:“导航栏”, 资料{ 返回{ isActive:[] } } }) module.exports=导航栏 函数pageName(pathname){}//不返回带空格的字符串 var currentPage=pageName(window.location.pathname) 如果(currentPage!=''){//如果不在主页中 navbar.data().isActive[currentPage]=true window.onbeforeunload=函数(){ navbar.data().isActive[currentPage]=false } }
在这里,我会反应性地将数组中的当前页面索引(例如:“login”)更新为true,当新页面被访问时(例如:“signup”),它们将被添加为索引并设置为true;并在卸载资源之前设置为false


也许我应该使用
Vue.set(vm.isActive,currentPage,false)
以便在vm.isActive不存在或不更新的情况下将新属性以反应方式添加到它。问题是创建Vue实例没有意义,因为我无法导出它。如果我修改navbarOpts并像我那样导出它,则每次渲染Navbar.vue时都会创建navbarOpts,并且它保存的所有内容都会丢失。

您没有正确使用单文件组件格式。您可以创建一个组件实例并将其导出,其中只应导出用于创建组件的选项对象(传递给
new Vue({…This object})的对象)

您没有正确使用单文件组件格式。您创建了一个组件实例并将其导出,您应该只导出用于创建组件的选项对象(传递给
新Vue({…此对象})的对象)
我最终使用另一种方法解决了这个问题,我认为这更正确

导航栏


导出默认值{ 名称:“导航栏”, 数据(){ 返回{ 路径:window.location.pathname } }, 方法:{ isActive(第页){ 返回此。当前页面===第页 } }, 计算:{ 当前页(){ 如果(this.path.length==1)返回“” const endIndex=this.path.indexOf('/',1) 返回(endIndex=-1) ?此路径子字符串(1) :this.path.substring(1,endIndex) } } }
我最终用另一种我认为更正确的方法解决了这个问题

导航栏


导出默认值{ 名称:“导航栏”, 数据(){ 返回{ 路径:window.location.pathname } }, 方法:{ isActive(第页){ 返回此。当前页面===第页 } }, 计算:{ 当前页(){ 如果(this.path.length==1)返回“” const endIndex=this.path.indexOf('/',1) 返回(endIndex=-1) ?此路径子字符串(1) :this.path.substring(1,endIndex) } } }
您可以使用路由的路径属性,查看


    仪表板 轮廓
导出默认值{ 名称:'侧边栏', 方法:{ isActive(第页){ 返回此。$route.path.indexOf(第页)!=-1; } } }
您可以使用路由的路径属性,查看


    仪表板 轮廓
导出默认值{ 名称:'侧边栏', 方法:{ isActive(第页){ 返回此。$route.path.indexOf(第页)!=-1; } } }
如果StackOverflow没有帮助,你可能还想尝试Gitter聊天:Gitter.im/vuejs/vue;它们在那里非常有用。如果StackOverflow没有帮助,你可能还想尝试Gitter聊天:Gitter.im/vuejs/vue;它们在那里非常有用。太好了,这就是问题所在。解决方法是将我以前使用过的对象保存在导航栏中传递给Vue构造函数,然后将其导出。现在,我不能使用Vue的任何方法,如arr.$set或Vue.set,来反应性地向数组添加索引,对吗?您可以使用所有这些方法,不用担心。我更新了代码并更好地描述了问题,有没有办法解决它?我找到了另一种方法,但我真的想确定现在,如果我所描述的是可行的。太好了,这就是问题所在。解决方案是将我之前传递给Vue构造函数的对象保存在navbar中,然后将其导出。现在,我不能使用Vue的任何方法,如arr.$set或Vue.set,来反应性地向数组添加索引,对吗?您可以使用所有这些方法,不用担心。我更新了编辑了代码,更好地描述了问题,有没有办法解决它
<template>
  <div class="navbar">
    <nav>
      <ul>
        <li v-bind:class="{ active: isActive['login'] }">
          <a href="/login">Log in</a>
        </li>
        <li v-bind:class="{ active: isActive['signup'] }">
          <a href="/signup">Sign up</a>
        </li>
      </ul>
    </nav>
  </div>
</template>

<script>    
  import Vue from 'Vue'

  var navbarOpts = {
    name: 'navbar',
    data {
      return {
        isActive: []
      }
    }
  })
  module.exports = navbar

  function pageName(pathname) {} // Returns no-spaced string

  var currentPage = pageName(window.location.pathname)

  if (currentPage !== '') { // If not in home page
    navbar.data().isActive[currentPage] = true
    window.onbeforeunload = function () {
      navbar.data().isActive[currentPage] = false
    }
  }
</script>
<template>
  <div class="navbar">
    <nav>
      <ul>
        <li v-bind:class="{ active: isActive('login') }">
          <a href="/login">Log in</a>
        </li>
        <li v-bind:class="{ active: isActive('signup') }">
          <a href="/signup">Sign up</a>
        </li>
      </ul>
    </nav>
  </div>
</template>

<script>
  export default {
    name: 'navbar',
    data () {
      return {
        path: window.location.pathname
      }
    },
    methods: {
      isActive (page) {
        return this.currentPage === page
      }
    },
    computed: {
      currentPage () {
        if (this.path.length === 1) return ''
        const endIndex = this.path.indexOf('/', 1)
        return (endIndex === -1)
          ? this.path.substring(1)
          : this.path.substring(1, endIndex)
      }
    }
  }
</script>
<template>
 <div class="sidebar sidebar-main sidebar-fixed">
   <div class="sidebar-content">
      <div class="sidebar-category sidebar-category-visible">
       <div class="category-content no-padding">
        <ul class="navigation navigation-main navigation-accordion">
         <li :class="{ active: isActive('dashboard') }">
          <router-link to="/dashboard">Dashboard</router-link>
         </li>    

         <li :class="{ active: isActive('profile') }">
          <router-link to="/dashboard">Profile</router-link>
         </li>    
        </ul>
       </div>
      </div>
     </div>
    </div>
</template>

<script>
 export default {
  name: 'SideBar',      
  methods: {
   isActive(page) {
     return this.$route.path.indexOf(page) !== -1;
   }
  }
 }
</script>