博客地址:https://ainyi.com/4
版本:vue 2.x
Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。
组件化和数据驱动,组件化就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用,数据驱动是前端的未来发展方向,释放了对DOM的操作,让DOM随着数据的变化自然而然的变化,不必过多的关注DOM,只需要将数据组织好即可。
//安装vue-cli
npm install -g vue-cli
//利用脚手架初始化项目
vue init webpack vue_project
==重点==:如果需要有些页面组件是挂载在某个组件之下,可以使用 children
const Layouts = () => import('@/views/Layouts')
const Detail = () => import('@/views/orderManagement/Detail')
const List = () => import('@/views/orderManagement/List')
const OrderRouter = [
{
path: '/cost',
redirect: '/cost/order-list',
component: Layouts,
children: [
{
path: 'order-list',
component: List
},
{
path: 'order-detail',
component: Detail
}
]
}
]
export default OrderRouter
// 这样写,组件 List 和组件 Detail 都是挂载在组件 Layouts 之下
// 前提是 Layouts 组件要写上 <router-view></router-view> 才可以挂载子组件
<router-link
:to="{
path: 'yourPath',
params: {
id: id,
dataObj: data
},
query: {
id: id,
dataObj: data
}
}">
</router-link>
path -> 是要跳转的路由路径,也可以是路由文件里面配置的 name 值,命名路由,两者都可以进行路由导航
params -> 是要传送的参数,参数可以直接key:value形式传递(类似post)
query -> 是通过 url 来传递参数的同样是key:value形式传递(类似get)
接收参数:
this.$route.query.id
this.$route.params.id
路由的配置
{
path:'/admin/:username', // :冒号后面是参数
component:() => import('../components/Admin.vue'),
name:"admin",
meta:{title:'个人中心'},
},
关于path路径加不加 / 的问题,加了/就是在根路径下跳转,不加就是在当前路径后面跳转,子页面,使用命名路由就不用管加不加 / 的问题了
注意:params传参 ,路径不能使用 path,只能使用 name,否则获取不到传的数据
this.$router.push({
name: 'dispatch',
params: {
paicheNo: obj.paicheNo
}
})
this.$router.push({
path: '/transport/dispatch',
query: {
paicheNo: obj.paicheNo
}
})
// or
this.$router.push({
name: 'dispatch',
query: {
paicheNo: obj.paicheNo
}
})
this.$router.push({ query: {paicheNo: obj.paicheNo }})
this.$router.push({ params: {paicheNo: obj.paicheNo }})
watch:{
//监听相同路由下参数变化的时候,从而实现异步刷新
'$route'(to,from){
//做一些路由变化的响应
this.loading = true;//打开加载动画
this.getCateShop();//重新获取数据
},
},
//在进入路由之前, 每一次都会执行此方法 全局钩子
router.beforeEach(function(to,from,next){
//设置网页标题
document.title = to.meta.title;
//检查是否已登录
let userObj = JSON.parse(sessionStorage.getItem('user'));
if(userObj){
//执行方法,将用户名设置进全局参数 vuex
//提交mutation的Types.SETUSERNAME方法
//第二个参数是携带的参数
//main.js使用vuex的提交方法,不需要this.$store.commit(),直接就store.commit()
store.commit(Types.SETUSERNAME,userObj.username);
}else{
//如果未登录,想要进入admin目录,则自动跳回首页
if(to.path.indexOf('admin') != -1){
// alert("进了");
router.push({name:'home'});
}
}
next(); //继续往下走
});
也叫延迟加载,即在需要的时候进行加载,随用随载,打开当前页面只加载当前页面的 js
简单的说就是:进入首页不用一次加载过多资源造成用时过长
实现方式,就是我一直以来的做法:
路由配置中,按需导入,配置每一个路由,就 import 需要的组件
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export default new Router({
mode:'history',
routes: [
{
path:'/',
redirect:'/home'
},
{
path:'/login',
component: () => import('../components/Login.vue'),
meta:{title:'登录'}
},
{
path:'/register',
component: () => import('../components/Register.vue'),
meta:{title:'注册'}
},
{
path:'/home',
component: () => import('../components/Home.vue'),
name:"home",
meta:{title:'首页'}
},
]
})
export default {
components: {
SectionHeader: () => import('@/components/SectionHeader'),
SectionArticle: () => import('@/components/SectionArticle'),
NoResult: () => import('./NoResult'),
}
}
文件:components/index.js
// 全局注册的组件
import MyHeader from './Header';
import MyFooter from './Footer';
import NotFound from './NotFound';
export default {
MyHeader,
MyFooter,
NotFound,
};
文件:main.js
// 加载全局组件
import components from './components';
// 注册全局组件
Object.keys(components).forEach(key => {
Vue.component(key, components[key]);
});
例如:可选的动态路径参数、匹配零个或多个、一个或多个,甚至是自定义正则匹配
const router = new VueRouter({
mode: 'history',
base: __dirname,
routes: [
{ path: '/' },
// params are denoted with a colon ":"
// 必传参数
{ path: '/params/:foo/:bar' },
// a param can be made optional by adding "?"
// 可有可无的参数
{ path: '/optional-params/:foo?' },
// a param can be followed by a regex pattern in parens
// this route will only be matched if :id is all numbers
// 匹配正则
{ path: '/params-with-regex/:id(\\d+)' },
// asterisk can match anything
// 匹配后面所有
{ path: '/asterisk/*' },
// make part of th path optional by wrapping with parens and add "?"
// 括号内路径可有可无
{ path: '/optional-group/(foo/)?bar' }
]
})
vue.use() 使用插件(执行的是插件的 install 方法)
如图划分原则:纵向:通过业务功能(可根据视图模块判断)划分 横向:通过Model-View-Controller三种不同职能划分
如上,将每个页面划分为 MVC 结构,在介绍前端在哪实现 MC 两层之前,先说一下 MVC 的概念:模型 Model:模型代表着一种企业规范,就是业务流程/状态的处理以及业务规则的规定。业务流程的处理过程对其他层来说是不透明的,模型接受视图的请求,并从接口返回结果。业务模型的设计可以说是MVC的核心
数据流动:view -> vuex(action) -> dao -> vuex(mutation) -> state -> (getters) -> view
数据流动:view -> service -> dao -> service -> view
<table>
<my-row>...</my-row>
</table>
<my-row>
会被当作无效的内容,因此会导致错误的渲染结果。变通的方案是使用特殊的 is 特性:
is 的值为:已注册组件的名字,或一个组件的选项对象<table>
<tr is="my-row"></tr>
</table>
这两种写法表达的意思是一样的,但是第一种写法是不符合 html 语法验证的,所以采用第二种写法
博客地址:https://ainyi.com/4
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。