phpcmsv9蓝色简洁下载网站模板,金融保险网站模板,如果有域名和空间怎么做网站,制作一个网站官网如果我们采用SPA(单网页应用)的设计方式,服务器会把前端文件一次性发过来,前端通过监听url的改变,选择展示那些内容,也就是前端路由一. 如何改变url但是页面不刷新?方式一: 改变哈希值hash比如,我们随便找一个网页我们在浏览器控制台输入发现网站的url有了些改变查看network却…如果我们采用SPA(单网页应用)的设计方式,服务器会把前端文件一次性发过来,前端通过监听url的改变,选择展示那些内容,也就是前端路由一. 如何改变url但是页面不刷新?方式一: 改变哈希值hash比如,我们随便找一个网页我们在浏览器控制台输入发现网站的url有了些改变查看network却没有任何请求方式二 history模式的方法(1). history.pushState()压栈式比如,我们随便找一个网页我们在浏览器控制台输入history.pushState({},,home)
发现网站的url有了些改变查看network却没有任何请求这种压栈式方法,可以使用浏览器返回上一页按钮弹栈,实际上是在调用history.back()也可以使用history.go() 操作栈history.forward() 等价于 history.go(1)
history.back() 等价于 history.go(-1)
(2): history.replaceState()非压栈式history.replaceState({},,home)二. 认识vue-router1.安装 vue-routercnpm install vue-router --save我们也可以在用CLi项目创建时就选择好 vue-router 这样项目创建时会送我们一个hello world的例子,我们可以先体验一下2.创建文件夹router,创建index.js用来存放我们的路由配置3.路由创建过程首先,我们在index.js创建一个vuerouter并暴露//1.导入VueRouter
import VueRouter from vue-router
//2.导入Vue (因为后面要用Vue.use())
import Vue from vue//3.通过Vue.use安装一下插件
Vue.use(VueRouter)//4.创建路由对象
routes[]const router new VueRouter({routes
})//5.暴露路由对象
export default router
在main.js中,我们挂载这个vuerouterimport Vue from vue
import App from ./App.vue
import router from ./router //6.导入暴露的vuerouter (/index.js是默认,路径中省略了)Vue.config.productionTip falsenew Vue({router, //7. 将导入的router传给自己的router属性render: h h(App),
}).$mount(#app)
4.配置映射关系上面的模板中,routes[], 我们没有配置映射关系, 现在我们来配置一下:第一步,导入页面组件第二步,创建映射关系第三步,在app.vue模板中(上级组件),添加router-link标签,这是一个触发url改变的入口第四步,在app.vue模板中(上级组件),添加router-view占位符标签,确定请求过来的内容的占位在router/index.js中import VueRouter from vue-router
import Vue from vue
import Home from ../components/Home //1. 导入第一个组件Home
import About from ../components/About //1. 导入第二个组件AboutVue.use(VueRouter)
const routes [{path: /, //2.添加映射关系component: Home},{path: /about, //2.添加映射关系component: About}
]const router new VueRouter({routes
})export default router
在App.js中templatediv idapprouter-link to/home首页/router-link !-- 3.使用路由 通过router-link标签,配置to属性提供链接目标,点击此标签会触发对应的url请求--router-link to/about关于/router-link!-- 3.使用路由 通过router-link标签,配置to属性提供链接目标,点击此标签会触发对应的url请求--router-view/router-view!-- 4.使用路由 通过router-view占位符标签,确定请求过来的内容的占位--/div
/templatescript
export default {name: App,
}
/scriptstyle scoped
/style路由重定向:const routes [{path:,redirect:home},
]
5.将默认的哈希方式改为history模式vue默认是使用hash方式的,我们可以给它改成history模式,这需要,我们在router/index.js中创建VueRouter时传入另一个参数const router new VueRouter({routes,mode:history
})
此外我们在cli初始化项目时,也可以默认history模式6.router-link 属性to属性 :指向的url地址tag属性: 默认是a标签,如果tagbutton,则渲染成标签.此外还可以是 li等replace属性: 采用非压栈式跳转,不可返回同时,我们注意到,当某个标签被点击时,他的class会自动添加两个类:router-link-exact-active和router-link-active有了这两个class,我们可以方便的写样式了7. 不用router-link,通过代码修改路径 $router.push上面的我们都是使用的 router-link来触发的url改变 有没有办法用普通的表单元素触发呢?有的.比如一个button 我们绑定了他的单击事件 btnClick,则我们可以在方法里写:每个组件都有一个全局对象叫$router,这个btnClick(){this.$router.push(/home)
}
上面是压栈式,当然也有非压栈式btnClick(){this.$router.replace(/home)
}
三. 动态路由 /:参数很多时候我们的url可能是不固定的,访问的页面的具体信息也会随着url改变,这就称之为动态路由. 例如: 我们访问张三的资料 /user/zhangsan 李四的是 /user/lisi 注册动态路由的方法是 /:参数 我们注册映射关系时,这样注册 {path:/user/:userId,component:User}
我们触发url时这样触发//在router-link上动态绑定
router-link :to/user/userId用户/router-link //或者通过普通标签的事件:btnClick(){this.$router.push(/user/this.userId)}
那么url跳转后如何在先页面中拿到跳转的参数呢? 用$route$route :当前活跃路由 每个组件都有一个全局对象$route
一定要和$router区分开!!!!!每个组件都有一个$route全局对象 (不是$router,少了一个r)我们看到这个 对象里有一个属性params ,里面有一个键值对 就是我们想要的,这时我们制作一个计算属性放在我们想显示的位置就好了 computed: {userId(){return this.$route.params.userId }},
四. 路由的懒加载当我们打包时,我们的bundle.js会变得特别大,太大的bundle会使得加载变慢,从而出现浏览器空白.但其实即使是单页程序,也无需浪费这段时间,同时给用户不好的体验.我们完全可以使用懒加载,将刚开始用不到的代代码先不加载,等用户触发了相关路由时再加载懒加载说白了就是不同的路由打包到不同的js里去懒加载如何实现??我们不要在一开始就import 而是在用到的地方,用箭头函数直接匿名import path: /about, //2.添加映射关系component: ()import(../components/About)},
这样,我们可以让首页之外的路由选择懒加载,都懒加载也可以五. 路由的嵌套为什么要路由嵌套?看下图:我们想在home页面请求路由,把路径改为/home/news, 但是页面还是在home页,只不过绿框里的内容改为了news组件的内容如何实现路由嵌套?1.映射路由因为还是在home页面,所以不能直接写路由映射,而是将路由映射嵌套在home的映射中具体做法是,将子映射写在父映射的children属性里 {path: /home, //这是home的映射component: Home,children:[ //它里面可以定义一个children,里面放子映射{path: , //添加默认子映射redirect:news},{path: news, //添加子映射关系 路径只写名字 newscomponent: ()import(../components/HomeNews)},{path: msgs, //添加子映射关系component: ()import(../components/HomeMsg)},]},
接下来我们在home.vue中确定显示位置 路径照实写templatedivh2我是首页/h2p我是首页内容/prouter-link to/home/news看看新闻/router-linkrouter-link to/home/msgs看看消息/router-linkrouter-view/router-view/div
/templatescript
export default {name: Home
};
/scriptstyle scoped
/style
六. 传递参数的路由传递参数的两种方式配置动态路由 /router/:参数query类型的传递 请求路径还是/router 但是同时会传一个query,如: /router?id123如果只需要传递一个符号,则选择第一种,如果信息较多,传递第二种第一种我们之前已经接触了,现在看1. 如何用query传递参数只需要在router-link 的to属性里绑定一个对象,对象有如下属性:router-link :to{path:/profile, --path属性还是路由链接--query:{ --query属性里面传入一个对象,对象里都是键值对-- id:lili,age:20,gender:girl}}Profile/router-link
新页面里如何取?还是用之前用过的$route对象this.$route.query
2.不用router-link怎么传query??$router.push和$router.replace传入上述对象即可 methods: {btnClick(){this.$router.push({path:/profile,query:{name:lili,age:18,gender:girl}})}}
七. keep-alive一个页面如果跳转到了另一个页面,那么这个页面会被销毁,此时如果用户又返回这个页面,又需要重新加载.keep-alive主要解决离开页面又返回时,页面需要重构的问题,这种重构很多时候都是没必要的1. 如何使用keep-alive?router-view其实也是个组件,如果它直接被包在keep-alive里面,所有涉及到的视图组件都会被缓存keep-alive是定义在Vue中的内置组件,目的是为了避免重新渲染例:我们想让home的两个次级路由的组件来回切换时不重新构建,可以给控制他们显示的router-view用keep-alive包起来templatedivh2我是首页/h2p我是首页内容/prouter-link to/home/news看看新闻/router-linkrouter-link to/home/msgs看看消息/router-linkkeep-aliverouter-view/router-view/keep-alive/div
/templatescript
export default {name: Home
};
/scriptstyle
/style2. 因为被keep-alive,子组件多了两个属性被keep-alive的组件都会多两个属性 activated 和 deactivated,里面可以传入方法,当活跃/不活跃时调用举例:templatedivh1您有4条短消息/h1ulli短消息1/lili短消息2/lili短消息3/lili短消息4/li/ul/div
/templatescript
export default {name:HomeMsg,activated() {console.log(我真活跃);},deactivated() {console.log(我不活跃了);},
}
/scriptstyle/style
3.keep-alive 的包含和例外如果又4个标签,我们想其中3个keep-alive怎么办???这时我们需要用keep-alive的属性 keep-alive excludeHomeMsg,User 这会排除这两个组件的keep-aliverouter-view/router-view/keep-alive
八. 导航守卫有时我们需要监听页面跳转 比如,我们要监听页面跳转,跳转时,将我们的网站的title该为对应页面的名称1.前置守卫前置守卫是跳转前的守卫我们可以在index.js里,给我们的router调用一个前置守卫(钩子)函数:router.beforeEach()router.beforeEach((to,from,next){ //这就是页面跳转过程document.title to.meta.matched[0].title //将页面标题改为了to路由的meta信息里的标题next() // 必须调用next(),以维护链式
})
前提是to路由里有meta,如: meta(描述信息) {path:/profile,component:()import(../components/Profile),meta:{title:档案},},
为什么有个 .matched[0], 因为有时我们进入嵌套路由,比如, home/news,但此时我们还想显示home的meta, 就可以通过这种方法找到它的第一级路由的meta2.后置守卫其实还有后置守卫(钩子):router.afterEach(to,from)后置守卫没有next3.next有大用next(): 进行管道中的下一个钩子。如果全部钩子执行完了则导航的状态就是 confirmed (确认的)。next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮)那么 URL 地址会重置到 from 路由对应的地址。next(/) 或者 next({ path: / }): 跳转到一个不同的地址。当前的导航被中断然后进行一个新的导航。你可以向 next 传递任意位置对象且允许设置诸如 replace: true、name: home 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。next(error): (2.4.0) 如果传入 next 的参数是一个 Error 实例则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。4.路由独享守卫你可以在路由配置上直接定义 beforeEnter 守卫const router new VueRouter({routes: [{path: /foo,component: Foo,beforeEnter: (to, from, next) {// ...}}]
})
5.组件内守卫你可以在路由组件内直接定义以下路由导航守卫const Foo {template: ...,beforeRouteEnter (to, from, next) {// 在渲染该组件的对应路由被 confirm 前调用// 不能获取组件实例 this// 因为当守卫执行前组件实例还没被创建},beforeRouteUpdate (to, from, next) {// 在当前路由改变但是该组件被复用时调用// 举例来说对于一个带有动态参数的路径 /foo/:id在 /foo/1 和 /foo/2 之间跳转的时候// 由于会渲染同样的 Foo 组件因此组件实例会被复用。而这个钩子就会在这个情况下被调用。// 可以访问组件实例 this},beforeRouteLeave (to, from, next) {// 导航离开该组件的对应路由时调用// 可以访问组件实例 this}
}
beforeRouteEnter 守卫 不能 访问 this因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。不过你可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调并且把组件实例作为回调方法的参数。beforeRouteEnter (to, from, next) {next(vm {// 通过 vm 访问组件实例})
}
注意 beforeRouteEnter 是支持给 next 传递回调的唯一守卫。对于 beforeRouteUpdate 和 beforeRouteLeave 来说this 已经可用了所以不支持传递回调因为没有必要了。beforeRouteUpdate (to, from, next) {// just use thisthis.name to.params.namenext()
}
这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过 next(false) 来取消。beforeRouteLeave (to, from, next) {const answer window.confirm(Do you really want to leave? you have unsaved changes!)if (answer) {next()} else {next(false)}
}