Javascript Vue.js中的动态导航组件
其思想是在Vue实例中使用“isActive”布尔数组,以便在每次加载导航栏时更新它,即使用从URL获取的当前页面名称作为数组中的索引,并将其值设置为true;和“onbeforeunload”将其设置为false 导航栏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”导入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>