1.下载node.js : https://nodejs.org/zh-cn/
安装步骤,一直点击next即可安装成功
2.安装成功后,打开cmd 输入 node -v即可查看安装成功后的node的版本
3.因为node.js在国外,国内和国外互联网之间有一道墙,所以建议用淘宝提供的镜像链接进行下载
安装全局阿里巴巴淘宝镜像:
npm install -g cnpm --registry=https://registry.npm.taobao.org
打开cmd输入 cnpm-v即可查看 cnpm的版本
(我着重用的是vue3 如果需要vue2可以自行百度使用)
1.安装脚手架 ,执行命令:
cnpm i @vue/cli -g
安装成功后打开cmd输入 vue-V即可查看版本
2.执行命令
vue create 项目名称
3.选择自定义功能配置
4. 按空格可选中需要的配置
5.根据自己需要选中
6.1 选择编码的规则
7.输入y即可
8.安装成功后 即可输入 npm run serve 运行项目
vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。
我们可以访问其官方网站对其进行学习:https://router.vuejs.org/zh/
vue-router是基于路由和组件的
路由用户设定访问路径的,将路径和组件映射起来。
在vue-router的单页面应用中,页面的路径的改变就是组件的切换
1.安装vue-router
npm install vue-router --save
有时候在脚手架创建项目的时候也可以进行自动安装
2.在模块化工程中使用它(因为是一个插件,所以通过Vue.use()来全局安装路由功能)
3.使用vue-router的步骤
{
path: ‘/’,
redirect: ‘/home’
},
配置路由重定向
5.路由模式
1.history模式
2.hash模式
区别:
6.router-link属性介绍
to:用于指定跳转的路径
tag:tag可以指定之后渲染成什么组件,比如我们下面的代码会被渲染成一个li元素,而不是a 。 如:router-link to=‘/home’ tag=‘li’
replace:replace不会留下history记录,所以指定replace的情况下,后退键返回不能返回到上一个页面中
active-class:当对应的路由匹配成功时,会自动给当前元素设置一个router-link-active的class,设置active-class可以修改默认的名称。
7.动态路由传值
7.1 query传参
路由:
var router = new VueRouter({
routes: [
{ path: '/login', component: login },
{ name:'register',path: '/register', component: register }
]
导航:
// 注意:这是 query 两种传参方式 一种是直接跳转把字符串传过去 一种是传描述目标位置的对象
<router-link to="/login?id=10&name=zs">登录</router-link>
<router-link :to="{path:'/register',query:{id:5,name:'lili'}}">注册</router-link>
或
<router-link :to="{name:'register',query:{id:5,name:'lili'}}">注册</router-link>
等同于:
this.$router.push('/login?id=10&name=zs')
this.$router.push({path:'/register',query:{id:5,name:'lili'}})
或
this.$router.push({name:'register',query:{id:5,name:'lili'}})
注意:注意:jquery可以通过name或path来引入路由
7.2 params传参
路由:
var router = new VueRouter({
routes: [
{ path: '/login/:id/:name', component: login },// 这里不传入对应的参数(:/id/:name) 刷新页面 参数会消失,页面中就丢失了数据
{ name:'register', path: '/register/:id/:name', component: register }
]
})
导航:
// 注意:这是 params 两种传参方式 一种是直接跳转把字符串传过去 一种是传描述目标位置的对象
<router-link to="/login/12/ls">登录</router-link>
<router-link :to="{name:'register',params:{id:10,name:'lili'}}">注册</router-link>
等同于:
this.$router.push('/login/12/ls')
this.$router.push({name:'register',params:{id:10,name:'lili'}})
注意:params只能通过name来引入路由,path会undefined
1.用法上:
2.地址栏表现形式上
query:
/login/12/ls
params:
/login?id=10&name=zs
注意:注意:这里的12和ls 对应的是/:id/:name 这两个参数可以不写 那么就不会在地址栏上显示 不过刷新页面参数会消失 写上参数刷新页面 参数不会消失
路由懒加载的方式
方式一:结合Vue的异步组件和Webpack的代码分析
const Home = resolve => { require. ensure([‘…/ components/Home.vue’], () => { resolve(require(‘…/components/Home.vue’)) })};方式二:AMD写法 const About = resolve => require([’ …/ components/ About.vue’], resolve);
方式三:在ES6中,我们可以有更加简单的写法来组织Vue
异步组件和Webpack的代码分割 const Home = () => import(’ . ./ components/Home.vue ’ )
其中用的最多的是ES6的写法
案例
详解
vuex是专门用来管理vue.js应用程序中状态的一个插件。他的作用是将应用中的所有状态都放在一起,集中式来管理。需要声明的是,这里所说的状态指的是vue组件中data里面的属性。了解vue的同学应该是明白data是怎么回事的吧,如果不懂的话,建议先学完vue的基础知识再看vuex。
1.npm i vuex --save/-S
2.创建store.js
import vuex from ‘vuex’
import vue from ‘vue’
3.第三步:Vue.use(vuex)
4.第四步:const store = new Vuex.Store({…配置项})
5.第五步:第五步:导出 export default store
6.第六步:导入main.js 在根实例配置 store 选项指向 store 实例对象
<div>{{$store.state.index}}</div>
<template>
<div>{{$store.state.index}}
<span>{{count}}</span>
</div>
</template>
<script>
export default {
computed:{
count(){
return this.$store.state.index;
}
}
}
</script>
<style>
</style>
总结:
1.state中的数据是自定义的,但是state的属性名是固定的
2.获取数据可以通过$store.state
3.可以使用计算属性优化模板中获取数据的方式
4.计算属性不可以使用箭头函数(箭头函数本身是没有this的,实际上用的是父级函数中的this)
简化获取store数据的代码
在组件中引入
import { mapState } from ‘vuex’
作用:当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键:
// 使用对象传参
computed:mapState({
1.基础写法
count:function(state){
return state.count
}
2.使用箭头函数
count: state => state.count
3.vuex提供的写法
count: 'count',
4.计算属性需要依赖vuex中的数据,同时依赖组件中data的数据
count(state){
return state.count + this.num
}
})
// 使用数组进行传参
computed:{
...mapState([
'index',
'count'
]),
}
总结
组件是否所有值都应该放在Store中?,不一定,数据仅仅在本组件中使用的不用放,放到store中的数据一般需要多个组件共享
Vuex规定必须通过mutation修改数据,不可以直接通过store修改状态数据
这样做的目的是是为了便于监控数据的变化
state: {
index:0,
count:3
},
getters: {
},
//修改存储数据
mutations: {
increment(state,payload){
state.count = state.count+payload
}
},
methods:{
increment(){
this.$store.commit('increment',2)
}
}
总结:
1.先定义(mutations),再出发 this.$store.commit(‘mutation的名称,参数’)
2.mutation的本质就是方法,方法名称自定义,mutation函数内部负责处理的变更操作。
3.一种操作就是一个mutation,不同的mutation处理不同的场景。
methods: {
// 1、对象参数的写法
// ...mapMutations({
// // 冒号右侧的increment是mutation的名称
// // 冒号左侧的increment是事件函数的名称,可以自定义
// increment: 'increment'
// })
// 2、数组参数的写法(事件函数名称和mutation名称一致)
...mapMutations(['increment'])
// 3、这种写法和第2种等效
// increment (param) {
// // 点击触发该函数后要再次触发mutation的
// this.$store.commit('increment', param)
// }
}
总结
mapMutations函数的作用:简化methods的定义
原始方式:通过$store.commit方法触发mutation
简写方式一:对象写法
简写方式二:数组写法
主要用于处理异步数据
npm i axios
//导入包
import axios from 'axios'
// actions是固定的,用于定义异步操作的动作(函数)
actions: {
// 定义了一个action,用于查询接口数据
async queryData (context, payload) {
console.log(payload)
// 调用接口获取数据
const ret = await axios.get('http://test.zjie.wang/tab')
// 必须触发mutation修改list的值
// context类似于this.$store
context.commit('updateList', ret.data.list)
}
},
mutations: {
updateList (state, payload) {
state.list = payload
}
}
methods: {
handleQuery () {
// 触发action(必须调用dispatch方法)
this.$store.dispatch('queryData', 111)
}
}
总结:
action的作用:
1.处理异步任务,获取异步结果后,把数据交给mutation更新数据
2.触发action需要使用 this.$store.dispatch
// 相当于 methods申明了一个函数fn(num){ this.$store.dispatch('queryData', num)}
// ...mapActions({
// fn: 'queryData'
// })
// 相当于 methods申明了一个函数getData(num){ this.$store.dispatch('getData', num)}
...mapActions(['queryData'])
总结
总结:原始方式:this.$store.dispatch(‘queryData’, num)
简化方式一:对象
简化方式二:数组
// 相当于state的计算属性(基于State处理成另外一份数据)
// getters的主要应用场景:模板中需要的数据和State中的数据不完全一样
// 需要基于state中的数据进行加工处理,形成一份新的的数据,给模板使用
getters: {
getPartList (state) {
return state.list.filter(item => {
return item.id > 1
})
}
}
caleList () {
// 注意:获取getters的值,不需要加括号(当属性使用)
return this.$store.getters.getPartList
},
import { mapGetters } from 'vuex'
// mapGetters的作用:把getters映射为计算属性
computed: {
...mapGetters(['getPartList']),
// ...mapGetters({
// calcList: 'getPartList'
// }),
// calcList () {
// // 注意:获取getters的值,不需要加括号(当属性使用)
// return this.$store.getters.getPartList
// },
}
总结:
1.getters相当于在State和组件之间添加一个环节(对state中的数据进行加工处理后再提供给组件)
2.getters不要修改state中的数据
3.getters类似之前的计算属性(基于state中的数据进行计算)