vue04-生命周期,Ajax,Router,webpack,CLI3.x

第七章 生命周期和 Ajax 服务端通信

7.1 Vue 实例生命周期

7.1.1 生命周期钩子函数

每个 Vue 实例在被创建时都要经过一系列的初始化过程

  • 生命周期分为三大阶段:初始化显示、更新显示、销毁Vue实例
    • 初始化阶段的钩子函数:
      beforeCreate() 实例创建前:数据和模板均未获取到
      created() 实例创建后: 最早可访问到 data 数据,但模板未获取到
      beforeMount() 数据挂载前:模板已获取到,但是数据未挂载到模板上。
      mounted() 数据挂载后: 数据已挂载到模板中
  • 更新阶段的钩子函数:
    beforeUpdate() 模板更新前:data 改变后,更新数据模板前调用
    updated() 模板更新后:将 data 渲染到数据模板中
    销毁阶段的钩子函数:
    beforeDestroy() 实例销毁前
    destroyed() 实例销毁后

7.1.2 生命周期图示

vue04-生命周期,Ajax,Router,webpack,CLI3.x_第1张图片

7.1.3 示例演示

  • 创建 vue-06-lifecycle&ajax 目录,在它下面新建 01-生命钩子.html 文件,测试Vue实例生命周期
  • 安装 Vue 模块
  • 示例代码:

<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>生命周期title>
head>
<body>
	<div id="app">
		<h1> {{ message }} h1>
	div>
	<script src="../node_modules/vue/dist/vue.js">script>
	<script>
		var vm = new Vue({
		el: "#app",
		data: {
			message: "fangsheng"
		},

		beforeCreate() {
			console.log('beforeCreate()', this.$el, this.$data)
		},
		created() { 
            // 已初始化 data 数据,但数据未挂载到模板中
			console.log('created()', this.$el, this.$data)
		},
		beforeMount() { 
            // 模板已获取到,但是数据未挂载到模板上
			console.log('beforeMount()', this.$el, this.$data)
		},
		mounted() { 
            // 编译完成 ,数据已挂载到模板中
			console.log('mounted()', this.$el, this.$data)
		},
		beforeUpdate() { 
            // 当 data 改变后,去更新模板中的数据前调用 // 注意:浏览器问题,需使用 this.$el.innerHTML 获取更新前的 Dom 模板数据
			console.log('beforeUpdate()', this.$el.innerHTML, this.$data)
		},
		updated() { 
            // data 被 Vue 渲染之后的 Dom 数据模板
			console.log('updated()', this.$el.innerHTML, this.$data)
		},
		beforeDestroy() { 
            // 销毁实例前调用
			console.log('beforeDestroy()')
		},
		destroyed() { 
            // 销毁实例后调用
			console.log('created()')
		}
        }).$mount('#app') // 实例中未使用 el 选项,可使用$mount()手动挂载Dom 
        // vm.$destroy() 销毁 Vue 实例
	script>
body>

html>

7.2 liveServer 服务端插件

  1. 在 VS Code 中安装 liveServer 服务端插件,用于 Ajax 接口调用。
    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第2张图片
  2. 启动服务器:
    方式1:任意打开一个 html 页面,在最下面可看到 在这里插入图片描述

点击它可启动,默认端口5500
方式2:在 html 页面单击右键 ,点击如下,访问页面
注意:如果之前启动过服务器,则使用 方式

2 启动html页面,不能使用 方式1 会端口占用
3. 更改 liveServer 默认端口号:
按 Ctrl + , 打开 Settings ,如下操作,打开 settings.json,
再json文件中添加 “liveServer.settings.port”: 8080,

vue04-生命周期,Ajax,Router,webpack,CLI3.x_第3张图片

7.3 Vue 中常用的 ajax 库

目前 Vue 官方没有内置任何 ajax 请求方法

7.3.1 vue-resource

在 vue1.x 版本中, 被广泛使用的非官方 Vue 插件 vue-resource

7.3.2 axios

在 vue 2+ 版本中,官方推荐使用非常棒的第三方 ajax 请求库
使用:结合生命钩子获取数据,渲染数据

7.4 vue-resource 的使用

7.4.1 参考文档

https://github.com/pagekit/vue-resource/blob/develop/docs/http.md

7.4.2 安装

npm install vue-resource

7.4.3 示例演示

  1. 在 vue-07-lifecycle&ajax 目录下 新建 db.json 文件存入模拟数据
[ {"name": "张三1", "age": 18}, {"name": "张三2", "age": 18} ]
  1. 在 vue-07-lifecycle&ajax 目录下,新建 02-vue-resource.html 文件

<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>生命周期title>
head>

<body>

	<div id="app">
		<h1>{{ repData }}h1>
	div>
	<script src="../node_modules/vue/dist/vue.js">script>
	
	<script src="../node_modules/vue-resource/dist/vue-resource.js">script>

	<script>
		// 使用插件 
		Vue.use(VueResource)

		var vm = new Vue({
			el: "#app",
			data: {
				repData: []
			},
			created() {
				this.$http.get('http://127.0.0.1:5500/vue-06-lifecycle&ajax/db.json').then((// 注意每个人的具体的URL 可能不一样  注意替换
					response) => {
					// 如果要使用Vue实例的this,此处需要使用箭头函数 
					// success callback
					console.log(response.data)
					// 响应数据 
					this.repData = response.data
				}, (response) => {
					// error callback
					console.log(response.statusText) //错误信息 
				})
			},

		})

	script>
body>

html>

7.5 axios 的使用

7.5.1 参考文档

https://github.com/axios/axios/blob/master/README.md

7.5.2 安装

npm install axios

7.5.3 示例演示

在 vue-06-lifecycle&ajax 目录下,新建 03-axios.html 文件


<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Axiostitle>
head>
<body>
	<div id="app">
		<h1>{{ repData }}h1>
	div>
	<script src="../node_modules/vue/dist/vue.js">script>
	
	<script src="../node_modules/axios/dist/axios.js">script>
	<script>
		var vm = new Vue({
			el: "#app",
			data: {
				repData: []
			},
			created() {
				axios.get('http://127.0.0.1:5500/vue-06-lifecycle&ajax/db.json').then((
					response) => {
					// 如果要使用Vue实例的this,此处需要使用箭头函数 
					// success callback
					console.log(response.data)
					// 响应数据 
					this.repData = response.data
				}, (response) => {
					// error callback
					console.log(response.statusText) //错误信息 
				})
			},

		})
	script>
body>
html>

7.6 组件化 axios 通信

  • 将 vue-06-组件化通信 复制到 vue-06-lifecycle&ajax 目录下, 重命名为 bootstarp
  • 进入 bootstarp 命令行,安装axios
npm install axios
  • index.html 引入 axios.js 文件, 注意引入位置
<body>
	 
	<div id="app"> 
	div>

	<script src="../../node_modules/vue/dist/vue.js">script>
	<script src="../../node_modules/axios/dist/axios.js">script>
	<script src="../../node_modules/pubsub-js/src/pubsub.js">script>
	
  <script src="components/AppNavbar.js">script>
  <script src="components/AppLeaf.js">script>
   
  <script src="components/home/Item.js">script>
  <script src="components/Home/Dashboard.js">script>
  <script src="components/Home/HomeList.js">script>
  <script src="components/home/AppHome.js">script>
  <script src="App.js">script>
  <script src="main.js">script>
body>

在 bootstarp目录下 新建 emp.json 文件存入模拟数据

[{
	"id": 1,
	"name": "张三1",
	"salary": 9899
}, {
	"id": 2,
	"name": "张三2",
	"salary": 9999
}, {
	"id": 3,
	"name": "张三3",
	"salary": 9099
}, {
	"id": 4,
	"name": "张三4",
	"salary": 9199
}]

  • 实现 axios 异步渲染数据, 重构 AppHome.js
;
(function () {
	const template = `

Dashboard

Section title

`
window.AppHome = { template, data() { return { hobbies: ['看书', '台球', '睡觉', '撸代码'], empList: [{ id: 1, name: '放生1', salary: 80001 }, { id: 2, name: '放生2', salary: 80002 }, { id: 3, name: '放生3', salary: 80003 }, { id: 4, name: '放生4', salary: 80004 }] } }, // 生命周期钩子 created() { axios.get('http://127.0.0.1:5500/vue-06-lifecycle&ajax/bootstarp/emp.json').then(response => { console.log(response.data) // 得到返回结果数据 this.empList = response.data }).catch(error => { console.log(error.message) }) }, methods: { // 删除指定下标的数据 // 因为删除 emp 会对 empList 做更新操作, // 而 empList 是初始化在当前这个组件里,所以删除的函数要定义在这个组件中 deleteEmp(index) { this.empList.splice(index, 1) }, //删除爱好 deleteHobby(index) { this.hobbies.splice(index, 1) // 删除成功,发布消息,导航统计数据 PubSub.publish('changeNum', 1) } }, components: { // 子组件 Dashboard, HomeList } } })()

效果:
vue04-生命周期,Ajax,Router,webpack,CLI3.x_第4张图片

第八章 Vue-Router 路由

8.1 什么是路由

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得非常简单。
通过根据不同的请求路径,切换显示不同组件进行渲染页面。

8.2 基本路由使用

创建 vue-08-router 目录,该目录下新建 01-vue-router-demo.html 文件

8.2.1 安装路由

注意:要安装 vue 模块
如果install 不下来可以网页下载对应的依赖 或者cope vue-router.js到对应的位置。

npm install vue-router

8.2.2 引入 vue-router.js

<script src="./node_modules/vue/dist/vue.js"></script> 
<script src="./node_modules/vue-router/dist/vue-router.js"></script>

8.2.3 HTML 路由切换


<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Routertitle>
head>
<body>
    <div id="app"> 
        <div class="header"> 
            <h1>头部h1> 
        div> 
            <div class="left">
            <p><ul>
             
            <li><a href="#/foo">Go Fooa>li>
            <li><a href="#/bar">Go Bara>li> 
             
             
             
            <li><router-link to="/foo">Go to Foorouter-link>li> 
            <li><router-link to="/bar">Go to Barrouter-link>li> 
            ul> p>
        div> 
        
        <div class="main"> 
                                     
         <router-view>router-view> 
        div> 
    div>


    <script src="../node_modules/vue/dist/vue.js">script> 
    <script src="../node_modules/vue-router/dist/vue-router.js">script>
    <script> 
    // 1. 定义组件 
    var Foo = { template: '
foo 组件
'
} var Bar = { template: '
bar 组件
'
} // 2. 配置路由表:当点击特定的 url 时,显示对应的那个组件。 const router = new VueRouter({ routes: [ //配置每个路由映射一个组件 { path: '/foo', component: Foo }, { path: '/bar', component: Bar } ] }) // 3. 注入路由到实例中 new Vue({ el: '#app', router // router: router })
script> body> html>

8.3 路由案例实战

8.3.1 拷贝项目

  1. 拷贝 vue-07-lifecycle&ajax\04-bootstrap-ajax 项目到 vue-08-router 下,
    重命名为: 02-bootstrap-ajax-router
  2. 进入 02-bootstrap-ajax-router 命令行,通过 NPM 安装 vue-router
npm install vue-router
  1. 修改 axios 请求地址
    因为改了目录名称,所以要修改 vue-08-router\02-bootstrap-ajax-router\components\home\AppHome.js的URL,不然请求失败。
 created() {
            axios.get('http://127.0.0.1:5500/vue-08-router/02-bootstrap-ajax-router/emp.json')
                .then(response => {//function (response) {
                    console.log(response.data, this);
                    this.empList = response.data
                })
                .catch(error => {//function (error) {
                    alert(error.message)
                })
        },
  1. 测试
    是否可以正常访问: http://127.0.0.1:5500/vue-08-router/02-bootstrap-ajax-router/index.html

8.3.2 News 组件

在 vue-08-router\02-bootstrap-ajax-router\components\home 目录下新建 News.js 文件

;
(function () {
    const template = ` 
     
    

世界杯开赛啦

世界杯于明晚8点举行开幕式.....

  • 5G时代到来了  
  • 互联网大洗牌  

世界杯开赛啦

世界杯于明晚8点举行开幕式.....

`
window.News = { template } })()

8.3.3 About 组件

在 vue-08-router\02-bootstrap-ajax-router\components\home 目录下新建 About.js 文件

;
(function () {
    const template = `

陪你学习,伴你梦想!

`
window.About = { template } })()

8.3.4 配置路由

在 vue-08-router\02-bootstrap-ajax-router 目录下新建 router.js 路由配置文件

;
(function () {
	window.router = new VueRouter({
		routes: [{
			path: '/',
			component: AppHome
		}, {
			path: '/news',
			component: News
		}, {
			path: '/about',
			component: About
		}]
	})
})()

8.3.5 注入路由到实例中

在 main.js 中的 Vue 实例中引入 router


; (function () {
new Vue({
    el: '#app',
    // Vue实例中的template选项中引用了组件后,会将这个组件的渲染结果替换掉 #app 标签的元素
    // template: ' ',
    template: '',
    router, // 引用路由配置
    components: {
      App // 等价于 App: App
    }

})
})()

8.3.6 配置路由渲染组件出口

在 App.js 中配置

;(function () {
    // 组件模板中,必须包含有且只有一个根元素
    const template = `

{{title}}

`
window.App = { template, data () { return { title: '仪表盘' } }, components: { AppNavbar, // 等价于 AppNavbar: AppNavbar AppLeaf, // AppLeaf: AppLeaf AppHome } } })()

8.3.7 修改跳转链接

在 AppLeaf.js 中修改跳转链接

;(function () {

    window.AppLeaf = {
        template: ``
    }

})()

8.3.8 引入 js 文件

在 index.html 中引入 vue-router.js 、Bar.js 、Foo.js、router.js ,注意引入的位置顺序

<body>
    <div id="app">
    div>
    <script src="./node_modules/vue/dist/vue.js">script>
     
    <script src="./node_modules/vue-router/dist/vue-router.js">script>
    
    <script src="./node_modules/axios/dist/axios.js">script>
    <script src="components/AppNavbar.js">script>
    <script src="components/AppLeaf.js">script>
    <script src="components/home/Dashboard.js">script>
    
    <script src="components/home/Item.js">script>
    <script src="components/home/HomeList.js">script>
    <script src="components/home/AppHome.js">script>
     
    <script src="components/home/News.js">script> 
    <script src="components/home/About.js">
    script> <script src="router.js">script>
    <script src="App.js">script>
    <script src="main.js">script>
    
  body>

8.3.9 启动测试

访问:http://127.0.0.1:5500/vue-08-router/02-bootstrap-ajax-router/index.html#/
点击左侧菜单 ,右侧显示不同的组件效果

8.4 样式匹配-高亮显示导航

问题:你会发现不管点击左侧导航哪个链接,当前都是在第一个导航处显示高亮背景。
按 F12 查看源代码,发现高亮样式在

  • 标签上,应该点击哪个作用在哪个上面
    参考路由 API 文档:https://router.vuejs.org/zh/api/
  • 8.4.1 tag

    默认渲染后生成 标签。
    可在 上使用 tag 属性,指定渲染后生成其他标签。

    <router-link to="/foo" tag="li">foo</router-link> 
    <!-- 渲染结果 --> 
    <li>foo</li>
    

    8.4.2 active-class

    渲染后生成标签上默认有 CSS 类名: router-link-active 。
    可在 上使用 active-class 属性,指定渲染后生成其他类名。
    可以通过路由的构造选项 linkActiveClass 来全局配置,不用在每个 使用 active-class 指定生成
    的类名 。

    8.4.3 exact

    默认情况 下,路由地址 / 、 /foo 、 /bar 都以 / 开头,它们都会去匹配 / 地址的 CSS 类名。
    可在 上使用 exact 属性开启 CSS 类名精确匹配。

    <!-- 这个链接只会在地址为 / 的时候被激活, --> 
    <router-link to="/" exact>
    

    8.4.4 实现高亮显示导航链接

    • 重构:AppLeaf.js
    ;
    (function () {
    
    	window.AppLeaf = {
    		template: ``
    	}
    
    })()
    
    
    • 重构 router.js
    ;
    (function () {
    	window.router = new VueRouter({
    		// 全局配置 router-link 标签生成的 CSS 类名 
    		linkActiveClass: 'active',
    		routes: [{
    			path: '/',
    			component: AppHome
    		}, {
    			path: '/news',
    			component: News
    		}, {
    			path: '/about',
    			component: About
    		}]
    	})
    })()
    
    
    • 重新访问,点击哪个就哪个有背景色
      vue04-生命周期,Ajax,Router,webpack,CLI3.x_第5张图片

    8.5 嵌套路由

    8.5.1 演示效果

    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第6张图片

    8.5.2 子路由组件

    Sport.js 体育栏目组件
    Tech.js 科技栏目组件

    8.5.3 配置嵌套路由

    ;
    (function () {
    	window.router = new VueRouter({
    		// 全局配置 router-link 标签生成的 CSS 类名 
    		linkActiveClass: 'active',
    		routes: [{
    				path: '/',
    				component: AppHome
    			}, {
    				path: '/news',
    				component: News,
    				children: [ // 当匹配到 /news/sport 请求时, // 组件 Sport 会被渲染在 News 组件中的 
    					{
    						path: '/news/sport',
    						component: Sport
    					},
    					{
    						 // 简写方式,等价于 /news/tech 路径,注意前面没有 / ,有 / 就是根目录了 
    						path: 'tech',
    						component: Tech
    					}, 
    					{
    						 //点击新闻管理默认选中 新闻, // 就是/news后面没有子路径时, redirect 重定向到 体育
    						path: '',
    						redirect: '/news/sport'
    					}
    				]
    			},
    
    			{
    				path: '/about',
    				component: About
    			}
    		]
    	})
    })()
    

    8.6 嵌套路由案例-新闻管理

    新闻管理模块中体育和科技栏目,点击不同栏目下方显示不同内容,将体育和科技为 Sport和 Tech 两个组件,
    所以将 News.js 中的模板内容区域分别抽取到 Sport.js 和 Tech.js 文件中

    • 拷贝 Vue\01-配套源码 下的 db 目录到 vue-08-router\02-bootstrap-ajax-router\ 下
      vue04-生命周期,Ajax,Router,webpack,CLI3.x_第7张图片

    8.6.1 Sport 组件

    在 vue-08-router\02-bootstrap-ajax-router\components\home 目录下新建 Sport.js 文件

    ;
    (function () {
        const template = ` 

    世界杯开赛啦

    世界杯于明晚8点举行开幕式.....

    `
    window.Sport = { data() { return { sportArr: [], } }, //钩子异步加载数据 created() { this.getSportArr() }, methods: { getSportArr() { axios.get('http://127.0.0.1:5500/vue-08-router/02-bootstrap-ajax-router/db/sport.json').then(response => { //function (response) { console.log(response.data, this); this.sportArr = response.data }).catch(error => { //function (error) { alert(error.message) }) } }, template } })()

    8.6.2 Tech 组件

    在 vue-08-router\02-bootstrap-ajax-router\components\home 目录下新建 Tech.js 文件

    ;
    (function () {
    	const template = ` 
            
    • {{tech.title}}  

    世界杯开赛啦

    世界杯于明晚8点举行开幕式.....

    `
    window.Tech = { data() { return { techArr: [] } }, //钩子异步加载数据 created() { this.getTechArr() }, methods: { getTechArr() { axios.get('http://127.0.0.1:5500/vue-08-router/02-bootstrap-ajax-router/db/tech.json').then(response => { //function (response) { console.log(response.data, this); this.techArr = response.data }).catch(error => { //function (error) { alert(error.message) }) } }, template } })()

    8.6.3 配置嵌套路由

    在 vue-08-router\02-bootstrap-ajax-router\router.js 中配置嵌套路由

    ;
    (function () {
    	window.router = new VueRouter({
    		// 全局配置 router-link 标签生成的 CSS 类名 
    		linkActiveClass: 'active',
    		routes: [{
    				path: '/',
    				component: AppHome
    			}, {
    				path: '/news',
    				component: News,
    				children: [ // 当匹配到 /news/sport 请求时, // 组件 Sport 会被渲染在 News 组件中的 
    					{
    						path: '/news/sport',
    						component: Sport
    					},
    					{
    						 // 简写方式,等价于 /news/tech 路径,注意前面没有 / ,有 / 就是根目录了 
    						path: 'tech',
    						component: Tech
    					}, 
    					{
    						 //点击新闻管理默认选中 新闻, // 就是/news后面没有子路径时, redirect 重定向到 体育
    						path: '',
    						redirect: '/news/sport'
    					}
    				]
    			},
    
    			{
    				path: '/about',
    				component: About
    			}
    		]
    	})
    })()
    

    8.6.4 跳转链接和路由渲染出口

    在 vue-08-router\02-bootstrap-ajax-router\components\home\News.js 中配置

    ; (function () {
        const template = ` 
         `
    	window.News = {
    		template
        }
        
    })()
    

    8.6.5 index.html 引入 js

    
      <body>
        <div id="app">
        div>
        <script src="./node_modules/vue/dist/vue.js">script>
         
        <script src="./node_modules/vue-router/dist/vue-router.js">script>
        
        <script src="./node_modules/axios/dist/axios.js">script>
        <script src="components/AppNavbar.js">script>
        <script src="components/AppLeaf.js">script>
        <script src="components/home/Dashboard.js">script>
        
        <script src="components/home/Item.js">script>
        <script src="components/home/HomeList.js">script>
        <script src="components/home/AppHome.js">script>
         
        <script src="components/home/News.js">script> 
    
        <script src="components/home/Sport.js">script> 
        <script src="components/home/Tech.js">script>
        
        <script src="components/home/About.js">
        script> <script src="router.js">script>
        <script src="App.js">script>
        <script src="main.js">script>
        
      body>
    

    8.6.6 启动测试

    访问:http://127.0.0.1:5500/vue-08-router/02-bootstrap-ajax-router/index.html
    点击新闻管理 ,右侧没有默认选中
    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第8张图片

    8.6.7 配置默认选中

    在 vue-08-router\02-bootstrap-ajax-router\router.js 的 news 子路由中配置默认重定向到新闻
    { path: ‘’, redirect: ‘/news/sport’}

    {
    	//点击新闻管理默认选中 新闻, // 就是/news后面没有子路径时, redirect 重定向到 体育
    	path: '',
    	redirect: '/news/sport'
    	}
    

    再重新测试下

    8.7 缓存路由组件与案例

    8.7.1 场景与作用

    1. 默认情况下,当路由组件被切换后组件实例会销毁,当切换回来时实例会重新创建。
    2. 如果可以缓存路由组件实例,切换后不用重新加载数据,可以提高用户体验。
      8.7.2 实现缓存路由组件
      可缓存渲染的路由组件实例
    <keep-alive> 
    <router-view></router-view> 
    </keep-alive>
    

    8.7.3 案例演示

    1. 在 vue-08-router\02-bootstrap-ajax-router\components\home\About.js 的模板中添加一个input输入框,
    ;
    (function () {
        const template = `

    陪你学习,伴你梦想!

    `
    window.About = { template } })()
    1. 输入框输入内容后,来回切换组件,实现输入框内容不会被清空。
      在 vue-08-router\02-bootstrap-ajax-router\App.js 中配置
     <!-- 配置路由渲染组件出口 --> 
      <keep-alive>
       <!-- 配置路由渲染组件出口 -->
       <router-view> 
       <h1 slot="dashboard" class="page-header">{{title}}</h1> 
       </router-view>
       </keep-alive>
    

    8.8 路由组件传递数据

    8.8.1 传递数据步骤

    1. 路由配置
    {
    				path: '/news',
    				component: News,
    				children: [ // 当匹配到 /news/sport 请求时, // 组件 Sport 会被渲染在 News 组件中的 
    					{
    						path: '/news/sport',
    						component: Sport,
    						children: [{
    							path: '/news/sport/detail/:id', // :id 路径变量占位符
    							component: SportDetail
    						}]
    					},
    					{
    						// 简写方式,等价于 /news/tech 路径,注意前面没有 / ,有 / 就是根目录了 
    						path: 'tech',
    						component: Tech
    					},
    					{
    						//点击新闻管理默认选中 新闻, // 就是/news后面没有子路径时, redirect 重定向到 体育
    						path: '',
    						redirect: '/news/sport'
    					}
    				]
    			},
    
    
    1. 路由跳转路径
    <!-- 要动态拼接值, 则 to 属性值是 JS 表达式, 要写 JS 表达式, 则要使用 v-bind 方式绑定属性 注意 + 前面有单引号 '' 
    -->
    <router-link :to="'/news/sport/detail/' + sport.id"> 
    {{sport.title}} 
    </router-link>
    
    1. 在路由组件中读取请求参数
    this.$route.params.id
    

    8.8.2 体育栏目案例

    需求:在 体育 栏目下点击标题后,在下方显示详情

    8.8.2.1 配置路由

    详情显示是属于 Sport 组件的,在 vue-08-router\02-bootstrap-ajax-router\router.js 中配置

    (function () {
    	window.router = new VueRouter({
    		// 全局配置 router-link 标签生成的 CSS 类名 
    		linkActiveClass: 'active',
    		routes: [{
    				path: '/',
    				component: AppHome
    		},
    			{
    				path: '/news',
    				component: News,
    				children: [ // 当匹配到 /news/sport 请求时, // 组件 Sport 会被渲染在 News 组件中的 
    					{
    						path: '/news/sport',
    						component: Sport,
    						children: [{
    							path: '/news/sport/detail/:id', // :id 路径变量占位符
    							component: SportDetail
    						}]
    					},
    					{
     ............  省略
    
    8.8.2.2 Sport 组件指定路径和渲染出口

    在 vue-08-router\02-bootstrap-ajax-router\components\home\Sport.js 中配置

    ;
    (function () {
        const template = ` 
    • {{sport.title}}
    `
    window.Sport = { data() { return { sportArr: [], } }, //钩子异步加载数据 created() { this.getSportArr() }, methods: { getSportArr() { axios.get('http://127.0.0.1:5500/vue-08-router/02-bootstrap-ajax-router/db/sport.json').then(response => { //function (response) { console.log(response.data, this); this.sportArr = response.data }).catch(error => { //function (error) { alert(error.message) }) } }, template } })()
    8.8.2.3 SportDetail 详情组件

    通过 this.$route.params.id 在 SportDetail 模板中可获取路径变量中的 id 值,
    在 vue-08-router\02-bootstrap-ajax-router\components\home\SportDetail.js 配置如下

    ;
    (function () {
        const template = ` 

    ID: {{ id }}

    {{sportDetail.title}}

    {{sportDetail.content}}

    `
    window.SportDetail = { template, data() { return { id: null, sportDetail: {} } }, created() { // 注意: // 1. 是 $route , 最后没有 r 字母 // 2. created 钩子只会调用1次,当切换标题列表的路由时,此钩子不会再次调用, // 所以对应 ID 不会被更新, 可以使用 watch 监听 $route 路由的变化。 this.getRportById() }, methods: { getRportById() { // 将路径变量值赋值给id this.id = this.$route.params.id - 0 // 1. 异步获取所有数据 axios.get('http://127.0.0.1:5500/vue-08-router/02-bootstrap-ajax-router/db/sport.json').then(response => { const sportArr = response.data // 2. 通过 id 获取指定数据 // find 会将满足条件的数据返回,仅返回一条 this.sportDetail = sportArr.find((detail) => { // this 要代表当前组件实现,则要使用箭头函数 return detail.id === this.id }) }).catch(error => { alert(error.message) }) } }, watch: { // 是对象,不是函数噢 // 使用 watch 监听 $route 路由的变化,获取 ID 值 '$route': function () { this.getRportById() console.log('$router改变了', this.id) } } } })()
    8.8.2.4 index.html 引入 js

    引入 SportDetail.js

    <body>
        <div id="app">
        div>
        <script src="./node_modules/vue/dist/vue.js">script>
         
        <script src="./node_modules/vue-router/dist/vue-router.js">script>
        
        <script src="./node_modules/axios/dist/axios.js">script>
        <script src="components/AppNavbar.js">script>
        <script src="components/AppLeaf.js">script>
        <script src="components/home/Dashboard.js">script>
        
        <script src="components/home/Item.js">script>
        <script src="components/home/HomeList.js">script>
        <script src="components/home/AppHome.js">script>
         
        <script src="components/home/News.js">script> 
    
         
        <script src="components/home/SportDetail.js">script>
        <script src="components/home/Sport.js">script> 
        <script src="components/home/Tech.js">script>
    
        <script src="components/home/About.js">
        script> <script src="router.js">script>
        <script src="App.js">script>
        <script src="main.js">script>
        
      body>
    

    测试 。。。

    8.9 编程式路由导航

    8.9.1 声明式与编程式路由

    声明式( 直接通过 标签href指定链接跳转) 编程式(采用 js 代码链接跳转,如 localhost.href)
    router.push(…)

    8.9.2 编程式路由导航 API

    this.$router.push(path) 相当于点击路由链接(后退1,会返回当前路由界面) this.$router.replace(path) 用新路由替换当前路由(后退1,不可返回到当前路由界面) 
    this.$router.back() 后退回上一个记录路由 
    this.$router.go(n) 参数 n 指定步数 
    this.$router.go(-1) 后退回上一个记录路由 
    this.$router.go(1) 向前进下一个记录路由
    

    8.9.3 科技栏目案例

    8.9.3.1 配置路由
    {
    	// 简写方式,等价于 /news/tech 路径,注意前面没有 / ,有 / 就是根目录了 
    		path: 'tech',
    		component: Tech,
    		children: [{ // 点击 栏目标题列表,查看详情
    			path: '/news/tech/detail/:id',
    			component: TechDetail
    		}]
    					},
    
    8.9.3.2 Tech 绑定点击事件和渲染出口
    • 测试JS函数中push/replace处理路由跳转 和 back/ge后退
    ;
    (function () {
    	const template = ` 
            
    • {{tech.title}}    
    `
    window.Tech = { data() { return { techArr: [] } }, //钩子异步加载数据 created() { this.getTechArr() }, methods: { pushTech(id) { // push 可后退回来 // 是 $router , 有字母 r 路由器。用的反单引号 ` ` 拼接 this.$router.push(`/news/tech/detail/${id}`) }, replaceTech(id) { // replace 不可后退回来 this.$router.replace(`/news/tech/detail/${id}`) }, getTechArr() { axios.get('http://127.0.0.1:5500/vue-08-router/02-bootstrap-ajax-router/db/tech.json').then(response => { //function (response) { console.log(response.data, this); this.techArr = response.data }).catch(error => { //function (error) { alert(error.message) }) } }, template } })()
    8.9.3.3 TechDetail 详情组件
    ;
    (function () {
    	const template = ` 
        

    {{techDetail.title}}

    {{techDetail.content}}

    `
    window.TechDetail = { template, data() { return { techDetail: {} } }, created() { // 不要少 this this.getTechById() }, methods: { // 通过 id 获取详情 getTechById() { // 1. 获取路径变量 id 值 const id = this.$route.params.id - 0 // 2. 获取所有数据 axios.get('http://127.0.0.1:5500/vue-08-router/02-bootstrap-ajax-router/db/tech.json').then(response => { const techArr = response.data // 3. 查找指定id的数据 this.techDetail = techArr.find(tech => { return tech.id === id }) }).catch(error => { alert(error.message) }) } }, watch: { // 是对象,不是函数噢 // 使用 watch 监听 $route 路由的变化,获取 ID 值 '$route': function () { this.getTechById() } } } })()
    8.9.3.4 index.html 引入 js
    • 引入TechDetail.js
    <body>
        <div id="app">
        div>
        <script src="./node_modules/vue/dist/vue.js">script>
         
        <script src="./node_modules/vue-router/dist/vue-router.js">script>
        
        <script src="./node_modules/axios/dist/axios.js">script>
        <script src="components/AppNavbar.js">script>
        <script src="components/AppLeaf.js">script>
        <script src="components/home/Dashboard.js">script>
        
        <script src="components/home/Item.js">script>
        <script src="components/home/HomeList.js">script>
        <script src="components/home/AppHome.js">script>
         
        <script src="components/home/News.js">script> 
    
         
        <script src="components/home/SportDetail.js">script>
        <script src="components/home/Sport.js">script> 
         
        <script src="components/home/TechDetail.js">script>
        <script src="components/home/Tech.js">script>
    
        <script src="components/home/About.js">
        script> <script src="router.js">script>
        <script src="App.js">script>
        <script src="main.js">script>
        
      

    第九章 Webpack和Vue-Loader打包资源

    详见 vue05

    第十章 Vue-CLI 3.x 脚手架构建项目

    10.1 什么是 Vue-CLI

    1. Vue-CLI 是 Vue 官方提供的, 用来搭建项目脚手架的工具,它是 Vue.js 开发的标准工具,它已经集成了
      webpack , 内置好了很多常用配置, 使得我们在使用 Vue 开发项目时更加的标准化。
    2. 作用: 通过 Vue-CLI 下载模板项目。
    3. 官方文档:https://cli.vuejs.org/zh/
    4. github站点:https://github.com/vuejs/vue-cli

    10.2 Vue CLI 安装

    Vue CLI 环境要求:
    需要 Node.js 8.9+ (推荐 8.11.0+)

    1. 全局安装 Vue-CLI
    npm install -g @vue/cli
    
    1. 安装成功后,在命令行可以使用 vue 命令,比如查看当前安装的版本:
    vue --version 
    # 或者 大写V 
    vue -V
    
    • 如果执行上面后,命令行提示 ‘vue’ 不是内部或外部命令
      在这里插入图片描述
    • 解决方法:配置环境变量
    1. 查看全局安装目录 nmp root -g
    2. 在 我的电脑 进入全局安装目录下,找到 vue.cmd
    3. 右键计算机,属性—》高级系统设置—》环境变量,将 vue.cmd 的路径加入环境变量,点击“确定”
      vue04-生命周期,Ajax,Router,webpack,CLI3.x_第9张图片
    4. 重启命令行窗口, vue -V 执行正常。

    10.3 基于 Vue-CLI 创建项目

    运行 vue create 命令来创建一个新项目

    vue create 项目名称
    

    10.3.1 创建默认项目

    1. 在 D:\StudentProject\WebStudy 目录下打开命令行窗口,输入以下命令进行新建项目,
      项目名是 vue-cli-demo1
    vue create vue-cli-demo1
    

    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第10张图片
    2. 会提示选择默认( default )还是手动( Manually ),默认的配置非常适合快速创建一个新项目的原型,而手动设置则提供了更多的选项。
    3. 这里选择 default ,等待一会(如有提示等待,一直回车执行下去就行)。
    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第11张图片
    4. 进入: cd vue-cli-demo1
    5. 运行: npm run serve
    6. 访问:http://localhost:8080/
    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第12张图片

    10.3.2 创建自定义项目

    1. 在 D:\WebProject\webStudy 目录下打开命令行窗口,输入以下命令进行新建项目,
      项目名是 vue-cli-demo2
     vue create vue-cli-demo2
    

    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第13张图片
    选择 Manually select features 手动选择自定义配置进行创建项目
    2. 如下图,根据项目需求, 选择哪些配置选项
    注意:按 空格键 是选中或取消, a 键是全选
    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第14张图片

    1 Bable, (常用)解决兼容性问题,支持 ES6 的代码转译成浏览器能识别的代码 
    2 TypeScript, 是一种给 JavaScript 添加特性的语言扩展,增加了很多功能,微软开发的 
    3 Progressive Web App (PWA) Support, 渐进式的Web应用程序支持 
    4 Router, (常用)是 vue-router 路由。 
    5 Vuex, 是Vue.js应用程序的状态管理模式+库 (常用)。 
    6 CSS Pre-processors, (常用)支持 CSS 预处理器, Sass/Less预处理器。 
    7 Linter / Formatter, (常用)支持代码风格检查和格式化。 
    8 Unit Testing, 支持单元测试。 
    9 E2E Testing, 支持 E2E 测试。
    
    • 选择对应配置选项:
      vue04-生命周期,Ajax,Router,webpack,CLI3.x_第15张图片
    • 选择后按回车键, 会提示: 是否使用 history 模式的路由, 按回车即可

    在这里插入图片描述

    • 选择CSS预处理器
      vue04-生命周期,Ajax,Router,webpack,CLI3.x_第16张图片
    • 选择ESLint + Prettier

    在这里插入图片描述

    • 选择语法检查方式,这里我选择: 保存就检测

    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第17张图片

    • 会提示: 把babel,postcss,eslint这些配置放哪,我选择: 放在独立文件中, 然后回来即可
      在这里插入图片描述
    • 会提示: 是否将当前项目设置的配置保存为预配置, 方便后面创建项目时, 继续使用这套配置?按回车保存即可,
      下次创建项目时,就会多有一个选项(vue-cli-demo2)
      在这里插入图片描述
      如果要删除 preset(预配置),在 C:\Users\你的用户名 目录下的 .vuerc 文件中删除
    • 确定后,等待下载依赖模块
      vue04-生命周期,Ajax,Router,webpack,CLI3.x_第18张图片
      vue04-生命周期,Ajax,Router,webpack,CLI3.x_第19张图片
      运行
    cd vue-cli-demo2 
    npm run serve
    

    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第20张图片


    10.4 CLI 服务命令
    参考 :https://cli.vuejs.org/zh/guide/cli-service.html
    CLI 服务 ( @vue/cli-service ) 是一个开发环境依赖。针对绝大部分应用优化过的内部的 webpack 配置;

    • 在一个 Vue CLI 项目中, @vue/cli-service 模块安装了一个名为 vue-cli-service 的命令。 在package.json 中的 scripts 指定 vue-cli-service 相关命令。
    "scripts": { 
    "serve": "vue-cli-service serve --open", 
    "build": "vue-cli-service build", 
    "lint": "vue-cli-service lint" 
    }
    
    1. serve 启动一个开发环境服务器(基于 webpack-dev-server)
      修改组件代码后,会自动热模块替换
      build 会项目根目录下自动创建一个 dist/ 目录,打包后的文件都在其中
    2. 打包后的 js 会自动生成后缀为 .js 和 .map 的文件
      js文件: 是经过压缩加密的,如果运行时报错,输出的错误信息无法准确定位到哪里的代码报
      错。
      map文件:文件比较大, 代码未加密,可以准确的输出是哪一行哪一列有错。
    3. lint 使用 Eslint 进行检查并修复代码的规范
      比如: 将 main.js 中的格式多加个空格 ,执行 npm run lint 后它会自动的去除多余空格 。
      执行命令方式:
    npm run serve 
    npm run build 
    npm run lint
    

    10.5 脚手架项目结构

    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第21张图片

    |-- node_modules: 存放下载依赖的文件夹 
    |-- public: 存放不会变动静态的文件,它与src/assets的区别在于,public目录中的文件不被webpack打包处理,会原 样拷贝到dist目录下 
    	|-- index.html: 主页面文件 
    	|-- favicon.ico: 在浏览器上显示的图标 
    |-- src: 源码文件夹 
    	|-- assets: 存放组件中的静态资源 
    	|-- components: 存放一些公共组件 
    	|-- views: 存放所有的路由组件 
    	|-- App.vue: 应用根主组件 
    	|-- main.js: 应用入口 js 
    |-- .browserslistrc: 指定了项目可兼容的目标浏览器范围, 对应是package.json 的 browserslist选项 
    |-- .eslintrc.js: eslint相关配置 
    |-- .gitignore: git 版本管制忽略的配置 
    |-- babel.config.js: babel 的配置,ES6语法编译配置 
    |-- package-lock.json: 用于记录当前状态下实际安装的各个包的具体来源和版本号等, 保证其他人在 npm install 项 目时大家的依赖能保证一致. 
    |-- package.json: 项目基本信息,包依赖配置信息等 
    |-- postcss.config.js: postcss一种对css编译的工具,类似babel对js的处理 
    |-- README.md: 项目描述说明的 readme 文件
    

    关于 browsers 的配置如下:

    代码 含义
    last 2 versions 每一个主流浏览器的最后5个版本
    last 2 Chrome versions 谷歌浏览器的最后两个版本
    > 2% 市场占有量大于2%
    > 2% in US 美国市场占有量大于2%
    ie 6-8 ie浏览器6-8
    Firefox > 20 火狐版本>20
    Firefox < 20 火狐<20
    since 2013 2013年之后发布的所有版本
    iOS 7 指定IOS 7浏览器

    10.6 自定义配置

    在项目根目录下创建 vue.config.js 文件。
    vue.config.js 基本常用配置(其他的具体看文档: https://cli.vuejs.org/zh/config/#vue-config-js)

    module.exports = {
    devServer: {
    	port: 8001, // 端口号,如果端口被占用,会自动提升 1 
    	open: true, // 启动服务自动打开浏览器 
    	https: false, // 协议 
    	host: "localhost", // 主机名,也可以 127.0.0.1 或 做真机测试时候 0.0.0.0
    }, 
    lintOnSave: false, // 默认 true, 警告仅仅会被输出到命令行,且不会使得编译失败。 
    outputDir: "dist2", // 默认是 dist ,存放打包文件的目录, 
    assetsDir: "assets", // 存放生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir) 目录 
    indexPath: "out/index.html", // 默认index.html, 指定生成的 index.html 的输出路径 (相对于 outputDir)。
    productionSourceMap: false, // 打包时, 不生成 .map 文件, 加快打包构建 
    };
    

    10.7 Eslint 插件

    10.7.1 什么是 ESLint

    ESLint 是一个语法规则和代码风格的检查工具,可以 用来保证写出语法正确、风格统一的代码。
    如果我们开启了 Eslint , 也就意味着要接受它 非常苛刻的语法检查,包括空格不能少些或多些,必须单引不能双
    引,语句后不可以写 分号等等,这些规则其实是可以设置的。
    我们作为前端的初学者,最好先关闭这种校验,否则会浪费很多精力在语法的规范性上。如果以后做真正的企业级
    开发,建议开启。Vue-Cli 中默认是开启的

    10.7.2 Eslint 配置介绍

    在项目根目录下的 package.json 文件中有 eslintConfig 选项中配置, 或者 .eslintrc.js 配置

    "eslintConfig": { // eslint配置 
    "root": true, // 用来告诉eslint找当前配置文件 
    "env": { // 指定你想启用的环境,下面的配置指定为node环境 
    "node": true 
    },
    "extends": [ 
    "plugin:vue/essential", // 格式化代码插件 
    "eslint:recommended" // 启用推荐规则 
    ],
    "rules": { //新增自定义规则 
    "semi":[1,'never'], // 禁止用分号 
    "indent": [2, 2] // 缩进采用2个空格 
    },
    "parserOptions": { "parser": "babel-eslint" //用来指定eslint解析器的 
    }
    },
    

    10.7.3 自定义语法规则

    参考:
    Vue Github文档:https://github.com/vuejs/vue-docs-zh-cn/blob/master/vue-cli-plugin-eslint/README.md
    Eslint 官方规则:https://cn.eslint.org/docs/rules/

    1. 语法规则写在 package.json 或 .eslintrc.js 文件中 rules 选项中, 语法如下:
    rules: { 
    "规则名": [错误等级值, 规则配置] 
    }
    

    规则值:

    "off" 或者 0 // 关闭规则 
    "warn" 或者 1 // 打开规则,作为警告(信息打印黄色字体)
     "error" 或者 2 // 打开规则,作为错误(信息打印红色字体)
    
    1. 常用 Eslint 规则配置参数
    "no-alert": 0,//禁止使用alert confirm prompt
    "no-array-constructor": 2,//禁止使用数组构造器 
    "no-bitwise": 0,//禁止使用按位运算符
    "no-caller": 1,//禁止使用arguments.caller或arguments.callee 
    "no-catch-shadow": 2,//禁止catch子句参数与外部作用域变量同名 
    "no-class-assign": 2,//禁止给类赋值 
    "no-cond-assign": 2,//禁止在条件表达式中使用赋值语句 
    "no-console": 2,//禁止使用console 
    "no-const-assign": 2,//禁止修改const声明的变量 
    "no-constant-condition": 2,//禁止在条件中使用常量表达式 if(true) if(1) 
    "no-continue": 0,//禁止使用continue 
    "no-control-regex": 2,//禁止在正则表达式中使用控制字符
    "no-debugger": 2,//禁止使用debugger 
    "no-delete-var": 2,//不能对var声明的变量使用delete操作符 
    "no-div-regex": 1,//不能使用看起来像除法的正则表达式/=foo/ 
    "no-dupe-keys": 2,//在创建对象字面量时不允许键重复 {a:1,a:1} 
    "no-dupe-args": 2,//函数参数不能重复 
    "no-duplicate-case": 2,//switch中的case标签不能重复 
    "no-else-return": 2,//如果if语句里面有return,后面不能跟else语句 
    "no-empty": 2,//块语句中的内容不能为空 
    "no-empty-character-class": 2,//正则表达式中的[]内容不能为空 
    "no-empty-label": 2,//禁止使用空label 
    "no-eq-null": 2,//禁止对null使用==或!=运算符
    "no-eval": 1,//禁止使用eval 
    "no-ex-assign": 2,//禁止给catch语句中的异常参数赋值 
    "no-extend-native": 2,//禁止扩展native对象 
    "no-extra-bind": 2,//禁止不必要的函数绑定 
    "no-extra-boolean-cast": 2,//禁止不必要的bool转换 
    "no-extra-parens": 2,//禁止非必要的括号 
    "no-extra-semi": 2,//禁止多余的冒号
    "no-fallthrough": 1,//禁止switch穿透 
    "no-floating-decimal": 2,//禁止省略浮点数中的0 .5 3. 
    "no-func-assign": 2,//禁止重复的函数声明 
    "no-implicit-coercion": 1,//禁止隐式转换 
    "no-implied-eval": 2,//禁止使用隐式eval 
    "no-inline-comments": 0,//禁止行内备注 
    "no-inner-declarations": [2, "functions"],//禁止在块语句中使用声明(变量或函数) 
    "no-invalid-regexp": 2,//禁止无效的正则表达式 
    "no-invalid-this": 2,//禁止无效的this,只能用在构造器,类,对象字面量 
    "no-irregular-whitespace": 2,//不能有不规则的空格 
    "no-iterator": 2,//禁止使用__iterator__ 属性 
    "no-label-var": 2,//label名不能与var声明的变量名相同 
    "no-labels": 2,//禁止标签声明 
    "no-lone-blocks": 2,//禁止不必要的嵌套块 
    "no-lonely-if": 2,//禁止else语句内只有if语句 
    "no-loop-func": 1,//禁止在循环中使用函数(如果没有引用外部变量不形成闭包就可以) 
    "no-mixed-requires": [0, false],//声明时不能混用声明类型 
    "no-mixed-spaces-and-tabs": [2, false],//禁止混用tab和空格
    "linebreak-style": [0, "windows"],//换行风格 
    "no-multi-spaces": 1,//不能用多余的空格 
    "no-multi-str": 2,//字符串不能用\换行 
    "no-multiple-empty-lines": [1, {"max": 2}],//空行最多不能超过2行 
    "no-native-reassign": 2,//不能重写native对象
    "no-negated-in-lhs": 2,//in 操作符的左边不能有! 
    "no-nested-ternary": 0,//禁止使用嵌套的三目运算 
    "no-new": 1,//禁止在使用new构造一个实例后不赋值 
    "no-new-func": 1,//禁止使用new Function 
    "no-new-object": 2,//禁止使用new Object() 
    "no-new-require": 2,//禁止使用new require
    "no-new-wrappers": 2,//禁止使用new创建包装实例,new String new Boolean new Number
    "no-obj-calls": 2,//不能调用内置的全局对象,比如Math() JSON() 
    "no-octal": 2,//禁止使用八进制数字 
    "no-octal-escape": 2,//禁止使用八进制转义序列 
    "no-param-reassign": 2,//禁止给参数重新赋值
    "no-path-concat": 0,//node中不能使用__dirname或__filename做路径拼接 
     "no-plusplus": 0,//禁止使用++,-- 
    "no-process-env": 0,//禁止使用process.env 
    "no-process-exit": 0,//禁止使用process.exit() 69 "no-proto": 2,//禁止使用__proto__属性 
    "no-redeclare": 2,//禁止重复声明变量 
    "no-regex-spaces": 2,//禁止在正则表达式字面量中使用多个空格 /foo bar/
    "no-restricted-modules": 0,//如果禁用了指定模块,使用就会报错 
    "no-return-assign": 1,//return 语句中不能有赋值表达式 
    "no-script-url": 0,//禁止使用javascript:void(0) 
    "no-self-compare": 2,//不能比较自身
    "no-sequences": 0,//禁止使用逗号运算符 
    "no-shadow": 2,//外部作用域中的变量不能与它所包含的作用域中的变量或参数同名 
    "no-shadow-restricted-names": 2,//严格模式中规定的限制标识符不能作为声明时的变量名使用 
    "no-spaced-func": 2,//函数调用时 函数名与()之间不能有空格
    "no-sparse-arrays": 2,//禁止稀疏数组, [1,,2]
    "no-sync": 0,//nodejs 禁止同步方法
    "no-ternary": 0,//禁止使用三目运算符 
    "no-trailing-spaces": 1,//一行结束后面不要有空格
    "no-this-before-super": 0,//在调用super()之前不能使用this或super
    "no-throw-literal": 2,//禁止抛出字面量错误 throw "error"; 
    "no-undef": 1,//不能有未定义的变量 
    "no-undef-init": 2,//变量初始化时不能直接给它赋值为undefined 
    "no-undefined": 2,//不能使用undefined 
    "no-unexpected-multiline": 2,//避免多行表达式 
    "no-underscore-dangle": 1,//标识符不能以_开头或结尾 
    "no-unneeded-ternary": 2,//禁止不必要的嵌套 var isYes = answer === 1 ? true : false; 
    "no-unreachable": 2,//不能有无法执行的代码
    "no-unused-expressions": 2,//禁止无用的表达式 
    "no-unused-vars": [2, {"vars": "all", "args": "after-used"}],//不能有声明后未被使用的变量或参数 
    "no-use-before-define": 2,//未定义前不能使用 
    "no-useless-call": 2,//禁止不必要的call和apply 
    "no-void": 2,//禁用void操作符
    "no-var": 0,//禁用var,用let和const代替 
    "no-warning-comments": [1, { "terms": ["todo", "fixme", "xxx"], "location": "start" }],//不能有警告备注 
    "no-with": 2,//禁用with
    "array-bracket-spacing": [2, "never"],//是否允许非空数组里面有多余的空格 
    "arrow-parens": 0,//箭头函数用小括号括起来 
    "arrow-spacing": 0,//=>的前/后括号 
    "accessor-pairs": 0,//在对象中使用getter/setter 
    "block-scoped-var": 0,//块语句中使用var
    "brace-style": [1, "1tbs"],//大括号风格"callback-return": 1,//避免多次调用回调什么的
    "camelcase": 2,//强制驼峰法命名 109 "comma-dangle": [2, "never"],//对象字面量项尾不能有逗号
    "comma-spacing": 0,//逗号前后的空格 
    "comma-style": [2, "last"],//逗号风格,换行时在行首还是行尾
    "complexity": [0, 11],//循环复杂度
    "computed-property-spacing": [0, "never"],//是否允许计算后的键名什么的 
    "consistent-return": 0,//return 后面是否允许省略
    "consistent-this": [2, "that"],//this别名
    "constructor-super": 0,//非派生类不能调用super,派生类必须调用super 
    "curly": [2, "all"],//必须使用 if(){} 中的{}
    "default-case": 2,//switch语句最后必须有default 
    "dot-location": 0,//对象访问符的位置,换行的时候在行首还是行尾 
    "dot-notation": [0, { "allowKeywords": true }],//避免不必要的方括号
    "eol-last": 0,//文件以单一的换行符结束 
    "eqeqeq": 2,//必须使用全等 
    "func-names": 0,//函数表达式必须有名字 
    "func-style": [0, "declaration"],//函数风格,规定只能使用函数声明/函数表达式 
    "generator-star-spacing": 0,//生成器函数*的前后空格
    "guard-for-in": 0,//for in循环要用if语句过滤
    "handle-callback-err": 0,//nodejs 处理错误 
    "id-length": 0,//变量名长度
    "indent": [2, 4],//缩进风格
    "init-declarations": 0,//声明时必须赋初值
    "key-spacing": [0, { "beforeColon": false, "afterColon": true }],//对象字面量中冒号的前后空格
    "lines-around-comment": 0,//行前/行后备注
    "max-depth": [0, 4],//嵌套块深度 
    "max-len": [0, 80, 4],//字符串最大长度
    "max-nested-callbacks": [0, 2],//回调嵌套深度
    "max-params": [0, 3],//函数最多只能有3个参数
    "max-statements": [0, 10],//函数内最多有几个声明
    "new-cap": 2,//函数名首行大写必须使用new方式调用,首行小写必须用不带new方式调用 
    "new-parens": 2,//new时必须加小括号
    "newline-after-var": 2,//变量声明后是否需要空一行
    "object-curly-spacing": [0, "never"],//大括号内是否允许不必要的空格
    "object-shorthand": 0,//强制对象字面量缩写语法
    "one-var": 1,//连续声明
    "operator-assignment": [0, "always"],//赋值运算符 += -=什么的
    "operator-linebreak": [2, "after"],//换行时运算符在行尾还是行首
    "padded-blocks": 0,//块语句内行首行尾是否要空行
     "prefer-const": 0,//首选const
     "prefer-spread": 0,//首选展开运算 
     "prefer-reflect": 0,//首选Reflect的方法 
    "quotes": [1, "single"],//引号类型 `` "" ''
    "quote-props":[2, "always"],//对象字面量中的属性名是否强制双引号
    "radix": 2,//parseInt必须指定第二个参数 
    "id-match": 0,//命名检测
    "require-yield": 0,//生成器函数必须有yield
    "semi": [2, "always"],//语句强制分号结尾 
    "semi-spacing": [0, {"before": false, "after": true}],//分号前后空格
    "sort-vars": 0,//变量声明时排序
    "space-after-keywords": [0, "always"],//关键字后面是否要空一格
    "space-before-blocks": [0, "always"],//不以新行开始的块{前面要不要有空格"space-before-function-paren": [0, "always"],//函数定义时括号前面要不要有空格
    "space-in-parens": [0, "never"],//小括号里面要不要有空格
    "space-infix-ops": 0,//中缀操作符周围要不要有空格
    "space-return-throw-case": 2,//return throw case后面要不要加空格
    "space-unary-ops": [0, { "words": true, "nonwords": false }],//一元运算符的前/后要不要加空格
    "spaced-comment": 0,//注释风格要不要有空格什么的 166 "strict": 2,//使用严格模式
    "use-isnan": 2,//禁止比较时使用NaN,只能用isNaN() 168 "valid-jsdoc": 0,//jsdoc规则
    "valid-typeof": 2,//必须使用合法的typeof的值 
    "vars-on-top": 2,//var必须放在作用域顶部 
    "wrap-iife": [2, "inside"],//立即执行函数表达式的小括号风格
    "wrap-regex": 0,//正则表达式字面量用小括号包起来
    "yoda": [2, "never"]//禁止尤达条件
    

    10.7.4 按规则自动修复代码

    执行下面命令会根据 Eslint 定义的语法规则进行检查,并按语法规则进行自动修复项目中不合规的代码

    npm run lint
    

    10.8 创建 .vue 模板代码

    10.8.1 安装插件识别vue文件

    插件库中搜索 Vetur 安装,未安装学员记得安装一个
    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第22张图片

    10.8.2 配置模板代码片段

    1. 依次选择 “ File(文件) -> preperences(首选项) -> User Snippets(用户代码片段)”,
      此时,会弹出一个搜索框,输入 vue , 如下:

    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第23张图片
    2. 选择 vue 后,VS Code 会自动打开一个名字为 vue.json 的文件,复制以下内容到这个文件中

    vue.json 模板内容,请复制网盘下载 vue.json 文件中的内容,不要复制pdf文件里的
    文件位置:02-参考资源\vue.json

    { 
    "Print to console": { 
    "prefix": "vue", 
    "body": [ 
    	"", 
    	"", 
    	"",
    	"",
    	"" 
    ],
    "description": "Log output to console" 
       } 
    }
    

    保存后关闭这个文件。
    说明: $0 生成代码后光标的位置 ; prefix 表示生成对应预设代码的命令

    10.8.3 测试

    新建一个名为 Demo.vue 的文件,输入 vue ,此时编辑区会有一系列提示,选择 Log output to console 这一项
    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第24张图片
    vue04-生命周期,Ajax,Router,webpack,CLI3.x_第25张图片

    10.9 部署项目

    10.9.1 打包项目

    进入到打包的项目文件夹下,运行以下命令

    npm run build
    

    打包成功后,项目文件夹下会多出 dist 目录,那么你可以将 dist 目录里构建的内容部署到任何静态文件服务器中。
    这里其实是调用了 webpack 来实现打包的。

    10.9.2 部署项目

    方式1:使用 Node.js 静态文件服务器 (serve)

    # 安装 server 
    npm install -g serve 
    # 本地部署 dist 目录下的项目 
    serve -s dist
    

    方式2:使用动态 web 服务器 (tomcat)

    1. 在项目的根目录下新建 vue.config.js 文件(是根目录,不是src目录)
      vue04-生命周期,Ajax,Router,webpack,CLI3.x_第26张图片
    2. 配置打包信息。比如,项目名字为 vue-demo
    module.exports = {
    publicPath: '/vue-demo/' 
    }
    
    1. 进行重新打包,因为 dist 目录下的文件会使用项目名称 /vue-demo/
    npm run build
    
    1. dist 目录拷贝到 tomcat\webapps 目录下,然后将 dist 目录名 修改为 项目名称 vue-demo
      vue04-生命周期,Ajax,Router,webpack,CLI3.x_第27张图片
    2. 打开 tomcat/bin/startup.bat 启动服务器(注意之前启动的 8080 端口项目要先停止)
    3. 访问:http://localhost:8080/vue-demo/
      vue04-生命周期,Ajax,Router,webpack,CLI3.x_第28张图片

你可能感兴趣的:(vue,前端,vue.js)