# Travel
**Repository Path**: tonysb/Travel
## Basic Information
- **Project Name**: Travel
- **Description**: 学习vue的第一个项目
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2018-11-13
- **Last Updated**: 2023-01-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# travel(笔记,基于Vue2.0)
## 环境搭建
### 必备软件1
+ git git --version 查看git版本
+ node npm -v 通过安装node,来集成npm功能,可在vue项目中轻松实现第三方库的管理
+ vue cli2 npm install -g vue-cli 全局安装vue提供的官方脚手架
+ webstorm 前端开发IDE
### Vue CLI2来构建项目
+ 文档地址: https://github.com/vuejs/vue-cli/tree/v2#vue-cli--
+ vue init webpack 项目名称 // 用webpack打包方式来创建vue项目(先创建一个文件夹,进入文件夹之后,执行该命令)
+ 提示如图
+ 
+ 项目目录介绍如图

#### 使用 vue cli2构建项目好处
+ vue直接用webpack管理好项目,webpack参数根据自己需求自己配置即可
+ 集成eslint,可帮助开发写出更加规范的js代码
+ package.json自动集成,可更方便在项目中管理第三方类库
+ 自动集成服务器,可快速开发,开发过程中支持热修改
r
#### 项目启动详解
+ 入口是index.html和main.js,这2文件是通过webpack的配置关联在一起,配置文件分别中,webpack.dev.conf.js和webpack.base.conf.js
+ main.js中会加载一个叫app的组件,由于router-view只能在组件中使用,所有在main.js的new Vue的时候会使用app组件,并使用template标签,渲染的时候,替换掉index.html中内容,全部走app组件中内容,由于app组件中有router-view,所有整个项目都是通过路由的方式,全部都走app这个组件,这样就形成了单页面应用
+ router文件夹中的index.js就是配置整个项目的路由
+ 综上,项目中一些共性文件以及第三方类库,都只需要在main.js中引入即可
#### webPack使用配置
+ 配置@快捷访问路径
~~~javascript
// webpack.base.conf.js,34行左右的位置
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
'styles': resolve('src/assets/styles'),
'common': resolve('src/common')
}
},
~~~
+ 配置静态mock的json数据访问路径
~~~javascript
//config文件夹下的index.js,13行左右的位置
proxyTable: {
'/api': {
target: 'http://localhost:8080',
pathRewrite: {
'^/api': '/static/mock'
}
}
},
~~~
### 测试
#### 前后端联调
服务器接口开发之后,需要将target中的请求地址填写服务器地址即可完成前后端联调
~~~javascript
// index.js文件,大概第13行位置,进行配置
proxyTable: {
'/api': {
target: 'http://localhost:8080',
pathRewrite: {
'^/api': '/static/mock'
}
}
/*前后端联调环境
'/api': {
target: 'http://localhost:8080' // 外网地址
}
*/
}
~~~
#### 配置ip地址访问
vueCli2默认生成的项目只能通过localhost进行访问,如果需要同一局域网内手机去访问,需要配置ip地址去访问项目
~~~javascript
// package.json文件中进行设置,大概第7行位置
"scripts": {
"dev": "webpack-dev-server --inline --host 0.0.0.0 --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"lint": "eslint --ext .js,.vue src",
"build": "node build/build.js"
},
~~~
#### 解决移动端onclick失效
BScroll默认是会阻止浏览器的原生 click 事件,所以在初始化BScroll需要开启click功能
~~~javascript
this.scroll = new BScroll(this.$refs.wrapper, { click: true })
~~~
#### 解决低版本安卓手机空白
~~~javascript
1) npm install babel-polyfill
2) 在main.js文件 import 'babel-polyfill'
~~~
### 部署服务端上线
+ npm run build
+ 最终生成的**dist文件夹**中的文件对服务器来说是有用的
+ 在index.js中设置assetsPublicPath参数,可根据需求,让项目运行在服务器那个文件夹下面
~~~javascript
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/aaa', // 运行在服务器aaa的文件夹下面
...}
~~~
## Vuex
1. 文档地址: https://vuex.vuejs.org/zh/guide/
2. 概念: 一个store(仓库),它可以接管项目中大部分state(状态),使用场景,多个组件之间公用的状态,购物车,登陆状态,默认城市.
**本项目中,首页右上角城市就使用了Vuex,首页跳转城市选择页面,城市选择页点击的城市就是首页右上角城市,这种场景使用Vuex最合适**
3. 特点
+ Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
+ 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。
4. 核心概念
+ state
**所有**状态数据集中营,整个项目中唯一存在,结构类似json
组件中获取state状态的方式:
1) 由于是响应式,**必须在组件的计算属性中获取**,这种模式导致组件依赖全局状态单例。在模块化的构建系统中,在每个需要使用 state 的组件中需要频繁地导入,并且在测试组件时需要模拟状态
2) 在根组件new Vue中引起store选项,从根传递到下面所有子组件(Vue.use(Vuex)),然后this.$store.state.count来访问
3) 使用mapState + 对象展开符来获取,同理获取getters中的计算数据,就可以使用mapGetters来获取
~~~javascript
computed: {
...mapState({
// 'city'等同于state.city
currentCity: 'city'
}),
...mapGetters({
doubleCity: 'doubleCity'
})
}
~~~
+ mutations
**用来改变store中状态唯一的一个地方**
定义所有用来改变状态集中营中某个状态改变的method,这里根据需求会存放很多的method,**是同步的**
所以根据需求,如果是同步操作,直接使用mutations改变,没必要通过actions提交到mutations再进行改变
~~~javascript
// 在组件中,使用对象展开运算符来进行分发
import { mapMutations } from 'vuex'
...mapMutations(['changeCity'])
~~~
+ actions
1) 不是改变状态,是提交到mutations
2) 可进行异步操作
~~~javascript
import { mapActions } from 'vuex'
// 在组件中,使用对象展开运算符来进行分发
...mapActions(['changeCity'])
// actions中使用ES6对象解构,可以简化代码
// Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,context中包含commit,state,getters等,
// 在函数参数中直接把context对象解构出来,然后可直接在函数体中直接用参数的方法
changeCity ({ commit, state }, city) {
commit('changeCity', city)
console.log(state.city)
}
~~~
+ getters
类似vue中计算属性,如果状态数据需要进行下一步处理之后再渲染到页面,全部放这里进行计算处理
~~~javascript
import { mapGetters } from 'vuex'
// 在组件中,使用对象展开运算符来进行分发
...mapGetters(['changeCity'])
~~~
具体代码看项目中首页右上角城市逻辑
综上Vuex的逻辑流程:
变更流程: state中定义好共性状态值 -> 状态值有变化,在相关组件methods中进行action分发->到mutations中,再提交commit->完成状态值变更
获取流程: 相关组件computed中,根据需求使用mapState或mapGetters来获取对应的状态值
## Vue Router
1. 文档地址: https://router.vuejs.org/zh/guide/
2. 动态路由匹配
模式: /user/:username 匹配路径: /user/evan $route.params:{ username: 'evan' }
3. 路由之间跳转的两种方式
+ 声明式跳转 参考文档: https://router.vuejs.org/zh/api/#router-link