五、Vue项目

一、项目环境搭载及创建

1. 软件及模块

	a. node
		
		用c++编写,用来运行js代码
	
	b. npm/cnpm
	
		终端应用商城
	
	c. vue
	
		用来搭建vue前端项目
	
2. 安装及下载

	a. 安装node
	
		官网下载安装包
	
	b. 安装cnpm
	
		npm install -g cnpm --registry=https://registry.npm.taobao.org
	
	c. 安装vue项目脚手架
	
		cnpm install -g @vue/cli
	
p.s.
	
	b或c终端安装失败时,可以清空npm缓存,再重复执行失败的步骤。

		npm cache clean --force


3. Vue项目创建

	a. 命令行创建
	
		1. 进入存放项目的目录
		
			>: cd ***
		
		2. 创建项目
		
			>: vue create 项目名
		
		3. 项目初始化
		
			推荐选择Babel, Router, Vuex, Linter
		
	
	b. pycharm配置vue项目
	
		1. app.vue只留下5行代码
		
		2. 路由中只留下home
		
		3. assets中创建css、js、img文件夹

		4. css文件夹中创建global.css,写下全局样式
		
			html, body, h1, h2, h3, h4, h5, h6, p, ul {
			    margin: 0;
			    padding: 0;
			}
			
			ul {
			    list-style: none;
			}
			a {
			    color: black;
			    text-decoration: none;
			}
			
		5. main.js中加载global.css
		
			require('@/assets/css/global.css');

二、vue项目目录结构分析

	├── v-proj
	|        ├── node_modules          // 当前项目所有依赖,一般不可以移植给其他电脑环境
	|        ├── public                        
	|        |        ├── favicon.ico        // 标签图标
	|        |        └── index.html        // 当前项目唯一的页面
	|        ├── src
	|        |        ├── assets                // 静态资源img、css、js
	|        |        ├── components        // 小组件
	|        |        ├── views                // 页面组件
	|        |        ├── App.vue                // 根组件
	|        |        ├── main.js                // 全局脚本文件(项目的入口)
	|        |        ├── router
	|        |        |        └── index.js// 路由脚本文件(配置路由 url链接 与 页面组件的映射关系)
	|        |        └── store        
	|        |        |        └── index.js// 仓库脚本文件(vuex插件的配置文件,数据仓库)
	|        ├── README.md
	└        └── package.json等配置文件

三、全局脚本文件main.js(项目入口)

1. 启动时功能

	a. 完成vue环境加载
	
	b. 完成组件渲染
	
	c. 加载vue-router、vuex等环境
	
	d. 加载自定义环境


2. 模板

	import Vue from 'vue'
	import App from './App.vue'
	import router from './router'
	import store from './store'
	
	Vue.config.productionTip = false
	
	new Vue({
	    router,
	    store,
	    render: h => h(App)
	}).$mount('#app')
	
	
3. 改写
	
	import Vue from 'vue'  // 加载vue环境
	import App from './App.vue'  // 加载根组件
	import router from './router'  // 加载路由环境
	import store from './store'  // 加载数据仓库环境
	
	Vue.config.productionTip = false
	new Vue({
	    el: '#app',
	    router,
	    store,
	    render: function (readFn) {
	        return readFn(App);
	    },
	});

四、路由跳转

1. 标签跳转

	<div class="content">
	    <ul>
	        <li class="route">
	            <router-link to="/">主页</router-link>
	        </li>
	        <li class="route">
	            <!--<router-link to="/course">课程页</router-link>-->
	            <router-link :to="{name: 'course'}">课程页</router-link>
	        </li>
	    </ul>
	</div>


2. 逻辑跳转
	
	export default {
	name: "Nav",
	methods: {
	    goHome() {
	        // console.log(this.$router);  // 控制路由跳转
	        // console.log(this.$route);  // 控制路由数据
	
	        if (this.$route.path !== '/') {
	            // this.$router.push('/');  // 往下再跳转一页
	
	            this.$router.push({
	                name: 'home'
	            });
	            // this.$router.go(2);  // go是历史记录前进后退,正为前进,负为后退,数字为步数
	        }
	    }
	}

五、路由传参

1. 传参方式总结

        配置                   跳转                 获取
        path:'/user'           to="/user?pk=1"      $route.query.pk
        path:'/user/:pk'       to="/user/1"         $route.params.pk
	

2. 传参方式一(course/detail?pk=1)

	a. router
	
		{
		path:'/course/detail',
		name:'course-detail',
		component:CourseDetail
		},
	
		
	b. CourseTag
	
		<template>
		    <div class="course-tag">
		        <img :src="course.img" alt="" @click="goDetail(course.id)">
		        <h2>{{ course.title }}</h2>
		    </div>
		</template>
		
		<script>
		    export default {
		        name: "CourseTag",
		        props: ['course'],
		        methods: {
		            goDetail(pk) {
		                this.$router.push(`'/course/detail?pk=${pk}'`)
		            }
		        }
		    }
		</script>
		
	
	c. CourseDetail
	
		<template>
		    <div class="course-tag">
		        <img :src="course.img" alt="" @click="goDetail(course.id)">
		        <router-link :to="{
		            name: 'course-detail',
		            query: {pk: course.id}
		        }">{{ course.title }}</router-link>
		    </div>
		</template>
		
		<script>
		    export default {
		        name: "CourseTag",
		        props: ['course'],
		        methods: {
		            goDetail(pk) {
		                console.log(pk);
		                // this.$router.push(`/course/detail?pk=${pk}`);
		                this.$router.push({
		                    name: 'course-detail',
		                    query: {pk: pk}
		                });
		            }
		        }
		    }
		</script>


3. 传参方式二(/course/1/detail)

	a. router
		
		{
		path:'/course/:pk/detail',
		name:'course-detail',
		component:CourseDetail
		},
		
	
	b. CourseTag
	
		<template>
		    <div class="course-tag">
		        <img :src="course.img" alt="" @click="goDetail(course.id)">
		        <router-link :to="`/course/${course.id}/detail`">{{ course.title }}</router-link>
		    </div>
		</template>
		
		<script>
		    export default {
		        name: "CourseTag",
		        props: ['course'],
		        methods: {
		            goDetail(pk) {
		                console.log(pk);
		                // this.$router.push(`/course/detail?pk=${pk}`);
		                this.$router.push({
		                    name: 'course-detail',
		                    query: {pk: pk}
		                });
		            }
		        }
		    }
		</script>
	
	
	c. CourseDetail

		<template>
		    <div class="course-detail">
		        <button @click="$router.go(-1)">返回课程主页</button>
		        <hr>
		        <h2>第{{ pk }}个课程</h2>
		    </div>
		</template>
		
		<script>
		    export default {
		        name: "CourseDetail",
		        data() {
		            return {pk: 0}
		        },
		        created() {
		            this.pk = this.$route.query.pk || this.$route.params.pk;
		        }
		    }
		</script>

六、vue组件(.vue文件)

	1. 标签及作用
	
		a. template
		
			有且只有一个根标签。
		
		b. script
		
			必须将组件对象导出,export default{}。
		
		c. style
		
			style标签明确scoped属性,代表该样式只在组件内部起作用。
	
	
	2. 导航栏组件示例
		
		<template>
		    <div class="nav">
		        <ul>
		            <li>
		                <router-link to="/">主&nbsp;页</router-link>
		            </li>
		            <li>
		                <router-link to="/car">汽&nbsp;车</router-link>
		            </li>
		        </ul>
		    </div>
		</template>
		
		<script>
		    export default {
		        name: "Nav.vue"
		    }
		</script>
		
		<style scoped>
		    .nav {
		        height: 60px;
		        background-color: #eee;
		    }
		    .nav li {
		        float: left;
		        padding: 15px 20px 0;
		    }
		    .nav a {
		        border-bottom: 3px solid transparent;
		        padding-bottom: 2px;
		    }
		    .nav a.router-link-exact-active {
		        color: orange;
		        border-bottom-color: orange;
		    }
		</style>
		
		
	3. 简单home组件示例
	
		<template>
		    <div class="home">
		        <Nav></Nav>
		        <h1>
		            <span @click="goCarPage">欢迎来到汽车系统</span>
		        </h1>
		    </div>
		</template>
		
		<script>
		    import Nav from '../components/Nav'
		
		    export default {
		        components: {
		            Nav
		        },
		        data() {
		            return {}
		        },
		        methods: {
		            goCarPage() {
		                if (this.$route.path !== '/car') {
		                    this.$router.push('/car')
		                }
		            }
		        },
		    }
		</script>
		
		<style scoped>
		    h1 {
		        text-align: center;
		        margin-top: 160px;
		    }
		    h1 span {
		        cursor: pointer;
		        font-weight: bold;
		        font-size: 60px;
		    }
		</style>

七、vue请求生命周期

1. 浏览器请求/user。

2. router插件映射User.vue组件。

3. User.vue组件替换App.vue中的<router-view />占位符。

八、组件生命周期钩子

1. 定义

	组件从创建到销毁中的时间节点回调的方法

2. 钩子种类

	<script>
	    import Nav from '../components/Nav'
	
	    export default {
	        data(){
	            return {
	                back_data: ''
	            }
	        },
	        methods: {},
	        components: {
	            Nav,
	        },
	
	        beforeCreate() {
	            console.log('Home组件要创建了');
	            console.log(this.back_data);
	        },
	        created() { // 重要方法:在该钩子中完成后台数据的请求
	            console.log('Home组件创建成功了');
	            console.log(this.back_data);
	        },
	        beforeMount() {
	            console.log('Home组件准备加载')
	        },
	        mounted() {  // 特别耗时的数据请求,可以延后到组件初步加载成功后,再慢慢请求
	            console.log('Home组件加载完成')
	        },
	        destroyed() {
	            console.log('Home组件销毁成功了')
	        }
	    }
	</script>
原文地址:https://www.cnblogs.com/binyuanxiang/p/12102529.html