Vue高级

1.nrm

nrm提供了一些最常用的npm包镜像地址,可以快速切换服务器地址下载资源。它只是提供了地址,并不是装包工具。如果没有安装npm,需要安装node,然后直接安装即可。node下载链接:https://pan.baidu.com/s/1kAgxxerNtSkYCIVqjXce6w 。提取码:s73z

1)全局安装nrm

npm install nrm -g

2)查看可用的以及当前使用的镜像地址

nrm ls

3)切换镜像地址

nrm use cnpm

use后面是地址的名称,也可以使用其他的,如taobao。由于npm install可以简写为npm i,因此后面就简写。--save-dev表示在编译时使用,简写为-D;--save表示在运行时使用,可简写为-S

2.webpack

2.1项目中网页的静态资源过多的影响

第一,网页加载速度很慢。第二,需要处理错综复杂的依赖关系。如何解决呢?可以使用webpack。

2.2什么是webpack

webpack是一个前端的项目构建工具,它基于nodeJs进行开发。可以实现资源的打包、整合、压缩、混淆等功能。

2.3webpack的安装

安装方式一:安装全局的webpack。因为vue-cli2依赖于webpack3.6.0。这样先安装3.6.0版本,如果不指定版本,去掉@3.6.0即可。

npm i webpack@3.6.0 -g

安装方式二:在项目根目录中安装,是比较常用的。

npm i webpack@3.6.0 --save-dev

 查看版本

webpack -v

如果出现webpack One CLI for webpack must be installed. These are recommended choices, delivered as separate,则执行下面一行命令即可。

npm i webpack-cli -g

2.4webpack基本使用

第一步:创建一个目录,名字为webpack。然后使用vscode方式打开webpack目录(webpack可自定义)

第二步:在webpack中在创建两个目录,分别为src和dist。src用来存放源代码,dist来存放最终的文件。

第三步:在src目录下新建一个index.html,有基本的标签即可。

第四步:在src下新建一个js目录,然后新建util.js,其内容如下,内容是为了测试方便,可自定义:

function add(num1,num2){
    console.log(num1+num2)
}
function mul(num1,num2){
    console.log(num1*num2)
}
const name='你好,张三'
//使用ES6方式导出
export default{
    add,
    mul,
    name
}
util.js

第五步:在src下新建一个main.js,用于调用util.js里面的方法和属性。使用webpack的方式进行导入的时候可省略后面的.js后缀名

//导入,使用webpack的方式进行导入的时候可省略后面的.js后缀名
import util from  './js/util'
util.add(20,25)
util.mul(20,25)
console.log(util.name)
main.js

第六步:在webpack目录下打开终端,输入一下命令

webpack ./src/main.js ./dist/bundle.js

表示的是使用webpack进行打包,把js之间的相关依赖进行处理,最终打包为bundle.js放到dist目录下

第七步:在index.html引入bundle.js。然后打开页面,会发现控制台正常输出了数据。在这里主要的就是使用webpack把浏览器不能识别的代码转为可以识别的代码进行运行。

2.5使用npm命令打包

不过一般情况下我们不会直接使用webpack命令进行打包,会使用npm的命令。在2.4中,去掉第六步及后面的操作步骤。接下来的步骤如下:

第六步:在webpack目录下打开终端,输入以下命令

npm init

执行之后,会出现要输入的界面,只需要随便输入package name,其他的直接回车即可。会在webpack的目录下生成一个package.json的文件。

第七步:修改package.json文件。找到scripts属性,在后面的对象中添加一下代码,如下图。

"build":"webpack"

当后面需要执行npm run build的时候,首先会去找项目本地的webpack,如果没有才会使用全局的。在命令行输入的指令都是使用全局的。 

第八步:安装本地(根目录)wenpack。在webpacl目录打开命令行输入

npm i webpack@3.6.0 -D

第九步:在webpack目录下新建webpack.config.js用来配置执行的脚本。内容如下

//导入node的path模块
const path = require('path')
//使用CommonJS的方式导入
module.exports = {
    // 配置入口文件
    entry: './src/main.js',
    // 配置出口文件
    output: {
        //path必须是绝对路径,__dirname是node中的获取上下文的路径
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js'
    }
}
View Code

对于这个配置文件,一般都是固定的,很少去修改。

第十步:在webpack目录打开终端输入下面npm命令进行打包,就显得非常的方便

npm run build

第十一步:在index.html引入bundle.js。然后测试。那么以后就是直接使用第十步的命令进行打包。

2.6使用loader加载文件

2.6.1使用loader加载css文件

在项目中,除了js文件,还有很多的css文件,最好的做法也是把css文件作为模块打包到js中。在2.5的基础上后续步骤如下:

1)在webpack目录下打开终端,执行两行代码,分别用来安装loader-style和loader-css并只在编译时有效

npm i -D style-loader
npm i -D css-loader 

css-loader只负责加载css文件,不渲染。style-loader负责把样式加入DOM中进行渲染。

2)在webpack.config.js中添加下面红颜色代码来配置module

module.exports = {
    ......
    //导入css使用的模块
    module: {
        rules: [
          {
        //匹配css文件 test: /\.css$/, //webpack加载loader是从右往左进行的 use: [ 'style-loader', 'css-loader'
] } ] } }

3)在src下进行css目录,新建index.css文件,内容为

body{
    background-color: red;
}
index.css

4)在main.js中导入css文件

//使用CommonJS导入css文件
require('./css/index.css')
View Code

然后使用npm命令打包运行即可。

2.6.2使用loader加载less文件

可能项目中不仅包含css文件,还包含less等样式文件。使用和css文件使用类似,在2.6的基础上后续步骤具体如下:

1)webpack目录下打开终端,执行一行代码,用来安装loader-less和less并只在编译时有效

npm i -D less-loader less

2)在webpack.config.js的module添加匹配规则

{
     test: /\.less$/,
     use: [{
           loader: "style-loader" // creates style nodes from JS strings
      }, {
           loader: "css-loader" // translates CSS into CommonJS
      }, {
            loader: "less-loader" // compiles Less to CSS
      }]
 }
View Code

3)在src/css下新建index.less,主要是设置字体的一些样式

@fontSize:100px;
@fontColor:white;

body{
    font-size: @fontSize;
    color: @fontColor;
}
index.less

4)在main.js中导入less文件。为了能够看到效果,使用了document.write来向页面显示文件

//导入less文件
require('./css/index.less')
document.write("<h2>你好啊,Webpack</h4>")
View Code

然后使用npm命令打包运行即可。

2.6.3使用loader加载image文件

有时候可以需要在css使用图片,在2.6的基础上用法如下:

1)webpack目录下打开终端,执行

npm i -D file-loader
npm i -D url-loader

2)在src下新建img目录,然后加入两张图片。两个图片大小最好有差别,我这里使用的图片大小分别是24.6kb和18.2kb。这个对url-loader的配置是有用的。

3)在webpack.config.js的module添加url-loader的匹配规则

        {
                test: /\.(png|jpg|gif|jpeg)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            //配置图片的大小限制为20kb
                            limit: 20480
                        }
                    }
                ]
            }
View Code

在配置url-loader中options时,limit设置的是20kb,介于两个图片之间。原因是当加载图片的大小小于limit的值时会把图片编译为base64字符串的形式,不会生成新的文件。当加载的图片大小大于limit的值时需要使用file-loader进行加载,图片会进行打包,打包到dist目录中。因此在开始的时候就安装了file-loader。

4)修改src/css/index.css文件,设置图片为背景,这里先使用小的图片测试

body{
    background: url("../img/test.jpg");
}
View Code

然后使用npm命令打包测试,在浏览器看到图片编译成了base字符串,如下图。

 5)上一步使用的小图片,现在使用大图片

body{
    background: url("../img/test2.jpg");
}
View Code

改为大图片的地址进行打包后发现页面并没有图片,控制台报错404。原因就是大图片会打包到dist中,而url的地址没有指定dist目录。

6)在webpack.config.js配置出口文件的图片地址

 publicPath: 'dist/'

 只要配置了publicPath路径,以后设计到任何url的地方都会去dist目录找。

7)在webpack.config.js配置图片的打包后的图片名称

name: 'img/[name].[hash:8].[ext]'

  这里就指定了图片的打包地址,放到img文件夹中并未图片进行重命名,[name]是原文件名,[hash:8]是使用hash进行编码并截取8位,[ext]后缀名。

2.6.4ES6转ES5

ES6固然好用,但是有时候为了兼容浏览器,会把ES6的代码转为ES5让浏览器可以识别。

1)在webpack目录执行

npm i -D babel-loader@7 babel-core babel-preset-es2015

2)在webpack.config.js的module添加匹配规则

        {
                test: /\.js$/,
                //排除不需要转化的文件夹
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['es2015']
                    }
                }
            }
View Code

打包运行即可,会发现bundle.js中都变成了es5的代码。

2.7webpack配置Vue和优化

2.7.1在index.html中使用vue

1)根据3.4和2.5的步骤创建一个名字为vue-demo的项目,项目中只需要src和dist目录以及配置文件webpack.config.js和package.json即可。

2)下载Vue,在开发和运行时都使用

npm i --save vue

2)在src下新建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">{{message}}</div>
    <script src="../dist/bundle.js"></script>
</body>
</html>
index.html

这里使用了data中的数据。

3)在src下新建main.js

// 导入vue
import Vue from 'vue'

new Vue({
    el:'#app',
    data:{
        message:'你好啊,Webpack'
    }
})
main.js

4)在webpack.config.js中设置vue的运行方式

runtime-only:这个方式在代码中不能包含template

runtime-compiler:这个方式在代码中科院包含template

module.exports = {
    ......  
    resolve: {
        //指定vue使用runtime-compiler
        alias: {
            'vue$': 'vue/dist/vue.esm.js'
        }
    }
}
View Code

2.7.2优化index.html

在实际的大型项目开发中,不会在index.html中使用vue的数据和方法,也就是说在index.html中只需要一个vue的框架即可,这个就是一个标准,后面就不会改了。

<body>
    <div id="app"></div>
    <script src="../dist/bundle.js"></script>
</body>

如何显示vue中的data和调用方法呢?只需要在vue实例中使用template即可。当实例中同时存在template和el时,template中的元素就会覆盖index.html中的那个原始的div标签。

1)在vue-demo目录下打开终端下载使用的loader

npm i -D vue-loader vue-template-compiler

2)在src目录下新建vue目录,在目录中新建App.vue文件

<template>
    <div>
        <h1>{{message}}</h1>
    </div>
</template>

<script>
    export default {
        name:'App',
        data() {
            return {
                message: '你好啊,Webpack'
            }
        },
        
    }
</script>

<style>
</style>
App.vue

3)在webpack.config.js中添加匹配规则

4)打包执行,发生如下错误vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config。这时简单的方法就是降低vue-loader的版本。修改package.json的vue-loader的版本,降低到13的版本

"vue-loader": "^13.0.0",

然后执行进行重新编译。只要修改了package.json的内容,就需要执行下面的一行代码。

npm i

然后再打包运行测试,页面就正常显示了。

当然,如果需要再添加组件,只需在vue的目录下新建vue文件即可。这里新建Cpn.vue为例

新建Cpn.vue

<template>
    <div>
        <span>今天学了vue</span><br>
        <span>好想开学</span>
    </div>
</template>

<script>
    export default{
        name:'Cpn'
    }
</script>

<style>
</style>
Cpn.vue

在App.vue中进行导入组件、注册和使用

<template>
    <div>
        <h1>{{message}}</h1>
        <Cpn></Cpn>
    </div>
</template>

<script>
    import Cpn from './Cpn.vue'
    export default {
        name:'App',
        data() {
            return {
                message: '你好啊,Webpack'
            }
        },
        components:{
            //注册Cpn
            Cpn
        }
    }
</script>

<style>
</style>
App.vue

这就是webpack使用vue的终极方式。

2.7.3 style中lang和scope的使用

当创建了一个vue是组件,如果要使用less等样式时,必须给style加上lang属性,指定样式。如果设置的样式只在本组件有效,需要给style加scoped属性。

<style lang="less">
</style>
添加lang属性
<style scoped>
</style>
添加scoped属性

2.8webpack中plugin的使用

plugin(插件):对webpack现有功能进行扩展,如打包优化,压缩文件。

plugin与loader的对比:plugin是对webpac本身的扩展,loader是一个转换器,用于转换类型。

2.8.1横幅(BannerPlugin)的使用

BannerPlugin用来声明版权,是wenpack内部从插件。操作在2.7的基础上进行,如下。

在webpack.config.js中导入webpack,并添加插件

const webpack=require('webpack')


plugins:[
    new webpack.BannerPlugin('最终版权归zys所有')
]
View Code

 打包之后会发现在dist的bundle.js在头部会出现“最终版权归...”的字样,这样就声明成功了。

2.8.2HtmlWebpackPlugin

最终会把index.html打包到dist目录中,就可以使用这个插件。

1)在vue-demo目录下安装插件

npm i -D html-webpack-plugin

2)导入插件并使用,修改方式如2.8.1的图,这里只给出代码

const HtmlWebPackPlugin = require('html-webpack-plugin')
new HtmlWebPackPlugin()

3)打包运行后,会发现在dist目录下有了index.html。但是现在有两个问题,一是这个文件中没有id是app的div,第二是引用的js路径问题,现需进行修改。

4)首先注释掉webpack.config.js中的publicPath。如果没有就跳过此步。

5)删除src/inex.html中js的引入并把index.html放到根目录下。这里它会自动引入。

6)HtmlWebpackPlugin添加模板。这里指定模板是使用index.html中的。

new HtmlWebPackPlugin({
    template: 'index.html'
})

2.8.3js压缩插件uglifyjs-webpack-plugin

用于把js进行压缩。

1)在根目录安装插件。这里使用1.1.1版本,与cli2保持一致

npm i -D uglifyjs-webpack-plugin@1.1.1

2)导入插件并使用

const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')
new UglifyjsWebpackPlugin()

打包运行后,发现js压缩了。那么注释也去掉了,那么入股用了版本声明也没用了。

2.8.4webpack-dev-server

当在编写的时候,每次写完就要进行打包,很麻烦,就可以搭建一个服务器,指定要服务的文件夹,把文件放在内存中,就可以修改后直接去浏览器查看,不用打包。打包只需要在最终进行版本发布的时候。

1)在项目根目录安装插件。这里使用2.9.3版本,与cli2保持一致

npm i -D webpack-dev-server@2.9.3

2)在webpack.config.js配置服务

module.exports = {
       ......
    devServer:{
        //指定要服务的文件夹
        contentBase:'./dist',
        //打开实时刷新
        inline:true
    }
}
devServer

3)在package.json中配置scripts脚本

"dev": "webpack-dev-server --open"

 然后直接使用npm命令来开启服务,就会直接在浏览器打开。

npm run dev

2.9配置文件的分离

根据开发和发布的不同进行分离配置文件webpack.config.js。在2.8的基础上进行分离。

1)在跟目录下新建一个目录build,在里面新建3个js文件,base.config.js(公共的配置)、dev.config.js(开发的配置)、prod.config.js(发布的配置)。

2)在根目录安装合并的模块

npm i  -D webpack-merge 

3)三个js的内容

const path = require('path')
const HtmlWebPackPlugin = require('html-webpack-plugin')
module.exports = {
    entry: './src/main.js',
    output: {
        path: path.resolve(__dirname, '../dist'),
        filename: 'bundle.js',
    },
    resolve: {
        alias: {
            'vue$': 'vue/dist/vue.esm.js'
        }
    },
    module: {
        rules: [{
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            },
            {
                test: /\.vue$/,
                use: ['vue-loader']
            }
        ]
    },
    plugins: [
        new HtmlWebPackPlugin({
            template: 'index.html'
        }),
    ],

}
base
const WebpackMerge = require('webpack-merge')
const baseConfig = require('./base.config')
module.exports = WebpackMerge(baseConfig, {
    devServer:{
        contentBase:'./dist',
        inline:true
    },
})
dev
const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin')
const WebpackMerge = require('webpack-merge')
const baseConfig = require('./base.config')
module.exports = WebpackMerge(baseConfig, {
    plugins: [
        new UglifyjsWebpackPlugin()
    ],
})
prod

4)删除根目录下的webpack.config.js

5)在package.json中指定配置文件

"build": "webpack --config ./build/prod.config.js",
"dev": "webpack-dev-server  --open --config ./build/dev.config.js"

然后运行npm run dev会打开服务器,运行npm run build会进行打包。有个细节就是在base.config.js中的path中由原来的dist改为了../dist。原因是配置文件放在了根目录想build目录中,而分离之前的配置文件在根目录下。

 3.Vue CLI3(脚手架)

3.1定义

CLI全程是Command-Line Interface,命令行界面,俗称脚手架,可以帮我们快速的创建vue项目,它会搭建好vue的环境和webpack的配置,提高开发效率。

3.2安装

Vue Cli的使用必须依赖node环境和webpack,如果没有安装需要先进行安装,这里默认都安装了。

cli3的安装命令

npm i -g @vue/cli

查看版本

vue -V

上面安装的是cli3的版本,如果要使用cli2的模板,就需要进行拉取。不过现在一般都是使用cli3。

npm i -g @vue/cli-init

使用cli创建项目:

/* cli3创建项目命令 */
vue create myproject
/* cli2创建项目命令 */
vue init webpack myproject

3.3使用CLI3创建项目

1)在需要创建项目的目录打开终端执行命令  

vue create vuecli

执行之后,会出现一些选择,具体看下面:

 这里就先选择默认的快速创建一个项目,在实际开发中一般选择手动配置。然后回车就会帮助我们进行创建。项目目录

 创建完成之后运行项目

cd vuecli
npm run serve

在浏览器输入127.0.0.1:8080即可访问默认的页面。npm run serve是开发时使用的,npm run build 用来项目打包发布。

2)查找并修改配置文件

第一种方式:执行命令,会启动一个服务,自动打开浏览器,我们选择导入,然后进行项目的配置。

vue ui

第二种方式:配置文件在vuecli/@vue/cli-service/webpack.config.js中,可进行配置。

第三种方式:在根目录下新建vue.config.js进行配置,名字必须是这个,可进行配置。

3.4安装node-sass

vue项目如果没有采用vue-cli方式创建,那么在项目下载之后,需要安装node-sass,不然会报错。安装后再进行编译

cnpm install node-sass@latest
npm install

npm install node-sass --registry=https://registry.npm.taobao.org
npm i

3.5清除缓存

npm cache clean -f

 

4.Vuex

Vuex是为Vue.js应用程序开发的状态管理模式。简单的来说,就是存放一些状态(变量)进行多组件的共享。

源码:https://github.com/zhongyushi-git/vuex-demo.git

Vuex.Store对象中有几个核心:

state:此对象是用来存放共享的数据
mutations:此对象用来修改数据,里面是执行的方法
actions:此对象用来做异步操作
getters:从state派生的数据,相当于state的计算属性
modules:模块化vuex,可以让每一个模块拥有自己的state、mutation、action、getters

先使用vue cli3创建一个项目vuex-demo,删除HelloWord.vue文件,接下来请看一下步骤。

4.1Vuex的基本使用

1)App.vue内容修改如下

<template>
  <div id="app">
    <h1>{{message}}</h1>
    <h2>{{$store.state.counter}}</h2>
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return {
      message: "我是app组件"
    };
  },

};
</script>

<style>
</style>

2)在根目录安装vuex插件

npm i -S vuex

3)在src下新建store/index.js,内容在下

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
    //存储状态
    state: {
        counter: 0
    },
})

export default store

在创建Vuex.Store对象中,state对象就是用来存放共享的数据,在其他组件中使用this.$store.state获取这个对象。除了使用这种方式来获取值外,还有另一种方式,详见下面第五步。

4)main.js内容修改在下

import Vue from 'vue'
import App from './App.vue'
import store from './store';

Vue.config.productionTip = false

new Vue({
  store,
  render: h => h(App),
}).$mount('#app')

然后使用npm目录运行项目,在浏览器中会显示counter的值为0。

5)使用第二种方式获取state的值

先在需要state的组件中导入mapState函数

import { mapState } from 'vuex'

然后按需映射为计算属性,数组里面放的就是需要的state的变量名

 computed: {
      //按需映射需要的变量名,...表示展开运算符
      ...mapState(['counter'])
},

使用值:

<h3>counter的值:{{counter}}</h3>

这种方式和第一种方式都是一样的效果。

4.2mulations的使用

vuex不推荐我们直接修改state中数据,而是在Vuex.Store对象中的mutations对象中添加方法来修改。

4.2.1mutations只使用state

index.js中添加mutations对象

const store = new Vuex.Store({
    //存储状态
    state: {
        counter: 0
    },
    //这里来修改数据
    mutations: {
        increment(state){
            state.counter++
        },
       decrement(state){
            state.counter--
        },
    },
})

App.vue中添加按钮和点击执行的方法

按钮如下:

<button @click="add">+1</button>
<button @click="dec">-1</button>

方法如下:

 add() {
    this.$store.commit('increment')
},
dec() {
    this.$store.commit('decrement')
}

必须使用commit进行提交。然后使用npm目录运行项目,点击+1或-1按钮,可以对counter进行修改。除了上面的方式之外,还有另一种方式来触发mutations函数:

第一:按需导入mapMutations函数

 import { mapMutations } from 'vuex'

第二:把指定的mutations函数映射为当前组件的methods函数

 methods: {
   ...mapMutations(['decrement'])
}

第三:在页面中使用这个方法,方法名即为数组中的变量名字

<button @click="decrement">-1</button>

若进行了分模块的方式,那么在进行commit时,必须指定模块的名称(模块名称/方法):

this.$store.commit('app/decrement')

这里假设一个模块叫app。

4.2.2mutations传递参数(Payload载荷)

在index.js的mutations对象中添加方法
 addCount(state, payload) {
       state.counter += payload
}

App.vue中添加按钮和点击执行的方法

按钮如下:

<button @click="addCount">+20</button>

方法如下:

addCount(){
      //传递参数
      this.$store.commit('addCount',20)
 }

4.2.3mutations提交风格

上面的两种方式都是普通的提交风格,其实还有另一种提交风格,即对象的方式。这里以4.2.2为例说明

修改App.vue的执行方法

addCount(){
      const count1 = 20
      //传递参数
      this.$store.commit({
        type:'addCount',
        count1
      })
    }

修改index.js的mutations对象中那个方法

 addCount(state, payload) {
      state.counter += payload.count1
 }

传入对象的方式,type为方法名,后面是参数。在mutations中那么第二个参数payload就变成了一个对象,即为传递过来的对象。

4.2.4mutations的类型常量

在index.js的mutations定义的方法,在App.vue中使用,如果方法很多的话就会出现一个问题,可能两边的名字不一致,维护起来很困难。

而mutations的类型常量就是来解决这个问题的。主要的思路就是新建一个js文件,里面定义好常量,两边的文件使用同一常量。

这里4.2.1的实例为例进行修改:

1)在src/store目录下新建mutations-type.js

export const INCREMENT = 'increment'
export const DECREMENT = 'decrement'

2)修改index.js,导入常量并使用

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

import {
    INCREMENT,
    DECREMENT
} from './mutations-type'

const store = new Vuex.Store({
    //存储状态
    state: {
        counter: 0,
    },
    //这里来修改数据
    mutations: {
        [INCREMENT](state) {
            state.counter++
        },
        [DECREMENT](state) {
            state.counter--
        },
     
})

export default store

3)修改App.vue,导入常量并使用

<template>
  <div id="app">
    <h1>{{message}}</h1>
    <h2>{{$store.state.counter}}</h2>
    <button @click="add">+1</button>
    <button @click="dec">-1</button>
  </div>
</template>

<script>
import { INCREMENT, DECREMENT } from "./store/mutations-type";
export default {
  name: "App",
  data() {
    return {
      message: "我是app组件"
    };
  },
  components: {},
  methods: {
    add() {
      this.$store.commit(INCREMENT);
    },
    dec() {
      this.$store.commit(DECREMENT );
    },
  }
};
</script>

<style>
</style>

两边使用了统一的常量,就不会出现不一致问题。

4.3getters的使用

有时候需要对共享数据进行操作后再使用或者直接获取state的值。

index.js中添加getters对象

 getters:{
        showCount(state){
            return state.counter+10
        }
    }
App.vue中使用getters的属性:通过this.$store.getters来获取这个对象
<h3>counter+10的值:{{$store.getters.showCount}}</h3>

获取后的counter的值就是+10后的值,特很好用。除了使用$store.getters来获取外,还有另一种方式:

第一:按需导入mapGetters函数

import {mapGetters } from 'vuex'

第二:把指定的getters函数映射为当前组件的计算属性

computed: {
      //按需映射需要的变量名,...表示展开运算符
      ...mapGetters(['showCount'])
    },

第三:在页面中使用这个方法,方法名即为数组中的变量名字

<h3>counter+10的值:{{showCount}}</h3>

上述是对state进行数据操作,也可以直接获取值:

 getters:{
        showCount(state){
            return state.counter
        }
    }

4.4Vuex的响应式规则

Vuex的响应式的前提是属性在store中已经初始化完成。

实例:给state中的某个对象添加属性和删除属性

在实例中,用的是Vue.set()方法给对象info添加一个新的属性,然后放到响应系统中。删除使用Vue.delete()方法。

4.5actions的使用

在mutations中定义的方法必须是同步方法不能是异步的。当然有时候也需要进行异步操作,需要把异步的操作放到actions中。如果要修改state的值,必须在actions中触发mutations里面的方法,而不能直接在actions中修改state的值。

4.5.1实例1:延时2秒后-1

在index.js中添加actions函数,使用延时调用减一的操作

 //异步的操作
    actions: {
        decAnysc(context) {
            setTimeout(() => {
                context.commit('decrement')
            },2000)
        }
    }

在App.vue中出发这个异步函数

decrement1(){
    this.$store.dispatch('decAnysc')
 }

在页面中引用

<button @click="decrement1">延时2秒-1</button>

点击之后就可以实现延迟减一。在第二步中使用的是$store.dispatch()来触发的,若需要携带参数,可参考mutations的携带参数。除了dispatch的方式触发异步外,还有第二种出发方式:

第一:按需导入mapActions函数

import { mapActions } from 'vuex'

第二:把指定的actions函数映射为当前组件的methods函数

 methods: {
      ...mapActions(['decAnysc']),
    decrement1(){
        this.decAnysc()
   }
 },

第三:在页面中使用这个方法,方法名即为数组中的变量名字

<button @click="decrement1">延时2秒-1</button>

4.6modules的使用

vuex推荐我们使用单一状态树,但是我们可能需要多状态,就可以把store分成模块,然后在modules中分别定义。每个模块就有了自己的五大核心。

4.7store中目录结构

当我们把五大核心都放在index.js中时,看起来代码很多,那么就可以把代码进行抽离。除了state放在index.js中,其他的四大核心全部拆分,放在对应的js中,优化的store的结构目录见下:   

分离出来之后,index.js文件很清晰,需要改就直接去找对应的文件即可。

5.项目开发模拟

5.1创建项目

使用vue-cli3创建一个项目,名为vue-test1。

5.2项目托管github

很多时候,会把项目放到github上,保证有备份。

5.2.1复制法提交

1)首先在github上创建一个仓库vue-test,包含有README.md文件

2)然后在vue-test1的同级目录打开终端,输入命令把仓库克隆到本地。如果是vue的项目,在运行的时候,首先要进行npm install命令。

git clone https://github.com/zhongyushi-git/vue-test.git

3)把vue-test1的所有文件复制到vue-test中,.git文件除外

4)设置提交时显示的用户名和邮箱

git config --global user.email "1916008067@qq.com"
git config --global user.name "zhongyushi-git"

5)把文件提交到远程仓库

git add .
git commit -m "提交说明"
git push

在提交的时候,可能会进行登录。输入用户名和密码登录后提交。后期修改了代码需要提交,直接使用第五步的三行命令即可。

5.2.2直接法提交

在复制法提交中,需要把创建好的项目文件复制到新的文件夹中,比较麻烦,那么可参考https://www.cnblogs.com/zys2019/p/14100809.html#_label1

5.3项目目录分层

对于目录结构的划分,是非常重要的,不仅方便开发,还便于维护。一般的分层如下图:

5.4项目开发中的问题及解决办法

5.4.1配置别名

在项目根目录创建vue.config.js

module.exports = {
    configureWebpack: {
        resolve: {
            alias: {
                'assets': '@/assets',
                'components': '@/components',
                'myCommon': '@/myCommon',
                'network': '@/network',
                'views': '@/views',
            }
        }
    },
}

当在其他的地方使用这些别名时,如果是静态资源只需要在前面加~,当使用的是组件时就不需要加。如使用assets文件夹:~assets。

5.4.2跨域问题

对于前后端分离的项目,不同的端口或者不同的域名,都会涉及跨域问题。需要在vue.config.js中配置即可,对于springboot的项目,也可以在后台进行配置。

module.exports = {
    ...

   //设置跨域
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8019', //设置调用的接口域名和端口号
        // changeOrigin: true,
        pathRewrite: {
          '^/training': '' //这里理解成用‘/training’代替target里面的地址,实际请求http://localhost:8019/training/login
          //'^/training': '/' //实际请求http://localhost:8019/login
        }
      }
    }
  },

 }

可以看出,在进行路径替换时,使用''和'/'的结果是明细不一样的。

上述只配置了一个路径,也是可以配置多个路径的,对于pathRewrite根据需要来写,一般可省略:

module.exports = {
  devServer: {
    port: 8002, // 前端的服务端口
    //自动打开浏览器
    open: true,
    //后端的项目映射,有多个路径就映射多个。正式环境则使用nginx进行配置多个
    proxy: {
      '/api': {
        target: 'http://localhost:8019', //设置调用的接口域名和端口号
      },
      '/upload': {
        target: 'http://localhost:8019'
      }
    },
  },

5.4.3编辑格式规范

在项目根目录创建.editorconfig

root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

5.5项目部署到nginx服务器

项目打包

npm run build

把dist目录复制到nginx的根目录

修改配置文件conf/nginx.conf

location /{ 
    root dist;
    try_files $uri $uri/ /index.html;
}

截图如下:

 在浏览器访问localhost即可访问项目。如果项目中涉及到跨域问题,需要使用nginx对后端项目配置动态代理。

需要注意的是,配置图中红色框内的值,否则在刷新页面或打开新窗口时会出现404。

5.6配置项目名访问

有时需要通过项目名访问,可进行如下的配置,假设项目名是school。

1)在vue.config.js配置publicPath。为了方便起见,把打包的目录名也设置同样的名称

2)在route的index.js中配置根路由base

3)把打包的目录放到nginx的dist目录下

4)配置nginx代理

 图中下划线的地方要特别注意,需要保持一致

posted @ 2020-03-08 12:03  钟小嘿  阅读(550)  评论(0编辑  收藏  举报