vue框架

1.vue项目环境搭建

2.pycharm配置vue项目

3.vue项目结构分析

4.vue组件分析

5.项目入口

6.项目运行生命周期分析

7.配置全局样式

8.nav导航栏封装

9.新增页面三步骤

10.组件生命周期钩子

11.页面跳转综合案例

一.vue项目环境搭建

"""
node ~~ python:node是用c++编写用来运行js代码的
npm(cnpm) ~~ pip:npm是一个终端应用商城,可以换国内源cnpm
vue ~~ django:vue是用来搭建vue前端项目的

1) 安装node
官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/

2) 换源安装cnpm
>: npm install -g cnpm --registry=https://registry.npm.taobao.org

3) 安装vue项目脚手架
>: cnpm install -g @vue/cli

 4)安装好了以后可以查看

 vue

 vue -v
 vue -- version

注:2或3终端安装失败时,可以清空 npm缓存 再重复执行失败的步骤
npm cache clean --force
"""

二. vue项目创建 和 pycharm配置vue项目

vue项目创建

1) 进入存放项目的目录
>: cd *** 切换到D盘下

2) 创建项目
>: vue create 项目名

3) 项目初始化

 pycharm配置vue项目

1) 用pycharm打开vue项目
2) 添加配置npm启动

 

 

三.vue项目结构分析

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

四.vue组件分析

补充:如果想在About页面也显示样式

 vue组件

# 1) template:有且只有一个根标签
# 2) script:必须将组件对象导出 export default {}
# 3) style: style标签明确scoped属性,代表该样式只在组件内部起作用(样式的组件化)
 1 <template>
 2     <!--只能有一个根标签-->
 3     <div class="test">
 4 
 5     </div>
 6 </template>
 7 
 8 <script>
 9     // 将组件对象导出用export default
10     export default {
11         // 名字是无所谓的
12         name: "Test"
13     }
14 </script>
15 
16 <style scoped>
17 
18 </style>
代码

组件与页面组件如何实现交互的小案例:
components文件夹

Test:

 1 <template>
 2     <!--只能有一个根标签-->
 3     <div class="test">
 4         <p>tttt</p>
 5     </div>
 6 </template>
 7 
 8 <script>
 9     // 将组件对象导出用export default
10     export default {
11         // 名字是无所谓的
12         name: "Test"
13     }
14 </script>
15 <!-- 你如果把scoped去掉了,就是全局起作用如果有相同的,取最后一个-->
16 <style scoped>
17     p{
18         color: red;
19     }
20 </style>
代码

Test2:

 1 <template>
 2     <!--只能有一个根标签-->
 3     <div class="test2">
 4         <p>ttttt2222</p>
 5     </div>
 6 </template>
 7 
 8 <script>
 9     // 将组件对象导出用export default
10     export default {
11         // 名字是无所谓的
12         name: "Test2"
13     }
14 </script>
15 
16 <style scoped>
17     p{
18         color:orange;
19     }
20 </style>
代码

views:文件夹

Home:

 1 <template>
 2   <div class="home">
 3     <T></T>
 4     <T2></T2>
 5   </div>
 6 </template>
 7 
 8 <script>
 9   // 导入 @ 符代表src
10   import T from '@/components/Test'
11   import T2 from '@/components/Test2'
12 
13   //导入 注册一下
14   export default {
15       components:{
16           T,
17           T2,
18       }
19   }
20 
21 </script>
View Code

五.项目入口

全局脚本文件main.js

import Vue from 'vue' // 导入了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')

也可以改写为:

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) 加载mian.js启动项目
    i) import Vue from 'vue' 为项目加载vue环境
    ii) import App from './App.vue' 加载根组件用于渲染替换挂载点
    iii) import router from './router' 加载路由脚本文件,进入路由相关配置
    
2) 加载router.js文件,为项目提供路由服务,并加载已配置的路由(链接与页面组件的映射关系)
    注:不管当前渲染的是什么路由,页面渲染的一定是根组件,链接匹配到的页面组件只是替换根组件中的
    <router-view></router-view>
    
3) 如果请求链接改变(路由改变),就会匹配新链接对应的页面组件,新页面组件会替换渲染router-view标签,
替换掉之前的页面标签(就是完成了页面跳转)

代码:

App.vue 根组件:

 1 <!--App.vue是一个根组件 在所有的大项目中根组件就这5句话-->
 2 <template>
 3   <div id="app">
 4      <!-- url路径会加载不同的页面组件
 5             eg:/red => RegPage  | /blue => BluePage
 6          来替换router-view标签,完成页面的切换
 7          -->
 8   <router-view></router-view>
 9 
10   </div>
11 </template>
View Code

view.vue 页面组件:

BluePage.vue:

 1 <template>
 2     <div class="blue-page"></div>
 3 </template>
 4 
 5 <script>
 6     export default {
 7         name: "BluePage"
 8     }
 9 </script>
10 
11 <style scoped>
12     .blue-page{
13         /*一个屏幕的宽度一个屏幕的高度*/
14          100vw;
15         height: 100vh;
16         background-color: blue;
17 
18     }
19 </style>
代码

RedPage.vue:

 1 <template>
 2     <div class="red-page"></div>
 3 </template>
 4 
 5 <script>
 6     export default {
 7         name: "RedPage"
 8     }
 9 </script>
10 
11 <style scoped>
12     .red-page{
13         /*一个屏幕的宽度一个屏幕的高度*/
14          100vw;
15         height: 100vh;
16         background-color: red;
17 
18     }
19 </style>
代码

还需要在路由中配置:router.js

 1 import Vue from 'vue'
 2 import Router from 'vue-router'
 3 import Home from './views/Home.vue'
 4 import RedPage from './views/RedPage.vue'
 5 import BluePage from './views/BluePage.vue'
 6 
 7 Vue.use(Router);
 8 
 9 export default new Router({
10   mode: 'history', // 就是历史记录的意思,注释掉的话会用#号模拟
11   base: process.env.BASE_URL,
12   routes: [
13     {
14       path: '/',
15       name: 'home',
16       component: Home
17     },
18     {
19       path: '/red',
20       name: 'red',
21       component: RedPage
22     },
23        {
24       path: '/blue',
25       name: 'blue',
26       component: BluePage
27     },
28 
29 
30   ]
31 })
代码

七.配置全局样式

assets/css/global.css
html, body, h1, h2, ul, p {
   margin: 0;
   padding: 0;
}
ul {
   list-style: none;
}
a {
   color: black;
   text-decoration: none;
}

main.js中新增

// 配置全局样式
import '@/assets/css/global.css'

 

有2个步骤:

 

八.nav导航栏封装

components/Nav.vue 小组件
 1 <template>
 2     <div class="nav">
 3         <!--还需要在小组件中完成一些布局-->
 4         <ul>
 5             <!--如何实现点谁就实现跳转到谁的页面
 6             但是用a标签的话有bug他不是单页面刷新(就是重新加载了一次项目界面)
 7             采用vue-router完成页面跳转-->
 8             <li>
 9                 <!--<a href="/">主页</a>-->
10                 <router-link to="/">主页</router-link>
11             </li>
12             <li>
13                 <!--<a href="/red">红页</a>-->
14                 <router-link to="/red">红页</router-link>
15             </li>
16             <li>
17                 <!--<a href="/blue">蓝页</a>-->
18                 <router-link to="/blue">蓝页</router-link>
19             </li>
20         </ul>
21     </div>
22 </template>
23 
24 <script>
25     export default {
26         name: "Nav"
27     }
28 </script>
29 
30 <style scoped>
31 /*样式布局*/
32     .nav{
33          100%;
34         height: 60px;
35         background-color: orange;
36     }
37     /*并排排起来*/
38     .nav li{
39         float: left;
40         /*字体 字重 大小  行高  字族*/
41         font: normal 20px/60px '微软雅黑';
42         padding: 0 30px;
43     }
44 
45     .nav li:hover{
46         cursor: pointer;
47         background-color: aquamarine;
48     }
49 
50     .nav li.active{
51         cursor: pointer;
52         background-color: aquamarine;
53     }
54 
55 </style>
代码

小组件创建好了,需要在每个页面组件里面添加一下:

views/HomePage.vue:RedPage.vue与BluePage都是添加下方三个步骤代码,都是一样的步骤
 1 <template>
 2     <div class="home">
 3         <!-- 3)使用Nav组件 -->
 4         <Nav></Nav>
 5     </div>
 6 </template>
 7 
 8 <script>
 9     // 1)导入Nav组件
10     import Nav from '@/components/Nav'
11     export default {
12         // 2)注册Nav组件
13         components: {
14             Nav,
15         }
16     }
17 </script>
View Code

九.新增页面三步骤

1) 在views文件夹中创建视图组件
2) 在router.js文件中配置路由
3) 设置路由跳转,在指定路由下渲染该页面组件(替换根组件中的router-view标签)
views/TanPage.vue: 页面组件
 1 <template>
 2     <div class="tan-page">
 3         <Nav></Nav>
 4     </div>
 5 </template>
 6 
 7 <script>
 8     import Nav from '@/components/Nav'
 9     export default {
10         name: "TanPage",
11         components: {
12             Nav
13         }
14     }
15 </script>
16 
17 <style scoped>
18     .tan-page {
19          100vw;
20         height: 100vh;
21         background-color: tan;
22     }
23 </style>
View Code
router.js  路由
 1 // ...
 2 import TanPage from "./views/TanPage";
 3 export default new Router({
 4     mode: 'history',
 5     base: process.env.BASE_URL,
 6     routes: [
 7         // ...
 8         {
 9             path: '/tan',
10             name: 'tan',
11             component: TanPage
12         }
13     ]
14 })
View Code
components/Nav.vue  小组件
1 <li>
2     <router-link to="/tan">土页</router-link>
3 </li>
View Code

十.组件生命周期钩子

# 1)一个组件从创建到销毁的整个过程,就称之为组件的生命周期
# 2)在组件创建到销毁的过程中,会出现众多关键的时间节点,如 组件要创建了、
  组件创建完毕了、组件数据渲染完毕了、组件要被销毁了、组件销毁完毕了 等等时间节点,
  每一个时间节点,vue都为其提供了一个回调函数(在该组件到达该时间节点时,
  就会触发对应的回调函数,在函数中就可以完成该节点需要完成的业务逻辑) # 3)生命周期钩子函数就是 vue实例 成员

注意:
任何一个组件:在vue组件的script的export default导出字典中直接写钩子函数

代码:

 1 export default {
 2     // ...
 3     beforeCreate() {
 4         console.log('组件创建了,但数据和方法还未提供');
 5         // console.log(this.$data);
 6         // console.log(this.$options.methods);
 7         console.log(this.title);
 8         console.log(this.alterTitle);
 9     },
10     // 该钩子需要掌握,一般该组件请求后台的数据,都是在该钩子中完成
11     // 1)请求来的数据可以给页面变量进行赋值
12     // 2)该节点还只停留在虚拟DOM范畴,如果数据还需要做二次修改再渲染到页面,
13     //  可以在beforeMount、mounted钩子中添加逻辑处理
14     created() {
15         console.log('组件创建了,数据和方法已提供');
16         // console.log(this.$data);
17         // console.log(this.$options.methods);
18         console.log(this.title);
19         console.log(this.alterTitle);
20         console.log(this.$options.name);
21     },
22     destroyed() {
23         console.log('组件销毁完毕')
24     }
25 }
View Code

十一.根据请求路径高亮路由标签案例

1) router-link会被解析为a标签,用to完成指定路径跳转,但是不能添加系统事件(因为是组件标签)
2) 在js方法中可以用 this.$router.push('路径') 完成逻辑跳转
3) 在js方法中可以用 this.$route.path 拿到当前请求的页面路由
components/Nav.vue

代码:

 1 <template>
 2     <div class="nav">
 3         <!--采用vue-router完成页面跳转,不能采用a标签(会发生页面刷新,本质就是重新加载了一次项目界面)-->
 4         <ul>
 5             <li @click="changePage('/')" :class="{active: currentPage === '/'}">
 6                 <!--<a href="/">主页</a>-->
 7                 <!--<router-link to="/">主页</router-link>-->
 8                 主页
 9             </li>
10             <li @click="changePage('/red')" :class="{active: currentPage === '/red'}">
11                 <!--<router-link to="/red">红页</router-link>-->
12                 红页
13             </li>
14             <li @click="changePage('/blue')" :class="{active: currentPage === '/blue'}">
15                 <!--<router-link to="/blue">蓝页</router-link>-->
16                 蓝页
17             </li>
18             <li @click="changePage('/tan')" :class="{active: currentPage === '/tan'}">
19                 <!--<router-link to="/tan">土页</router-link>-->
20                 土页
21             </li>
22         </ul>
23     </div>
24 </template>
25 
26 <script>
27     export default {
28         name: "Nav",
29         data() {
30             return {
31                 // 没渲染一个页面,都会出现加载Nav组件,currentPage就会被重置,
32                 // 1)在点击跳转事件中,将跳转的页面用 数据库 保存,在钩子函数中对currentPage进行数据更新
33                 // currentPage: localStorage.currentPage ? localStorage.currentPage: ''
34                 // 2)直接在created钩子函数中,获取当前的url路径,根据路径更新currentPage
35                 currentPage: ''
36             }
37         },
38         methods: {
39             changePage(page) {
40                 // console.log(page);
41                 // 当Nav出现渲染,该语句就无意义,因为在data中将currentPage重置为空
42                 // this.currentPage = page;
43 
44                 // 有bug,用户不通过点击,直接修改请求路径完成页面跳转,数据库就不会更新数据
45                 // localStorage.currentPage = page;
46 
47                 // 任何一个标签的事件中,都可以通过router完成逻辑条件
48                 // console.log(this.$route);  // 管理路由数据
49                 // console.log(this.$router);  // 管理路由跳转
50                 this.$router.push(page);  // 路由的逻辑跳转
51             }
52         },
53         // 当前组件加载成功,要根据当前实际所在的路径,判断单选激活标签
54         created() {
55             // console.log(this.$route.path);
56             this.currentPage = this.$route.path;
57         }
58     }
59 </script>
60 
61 <style scoped>
62     .nav {
63         width: 100%;
64         height: 60px;
65         background-color: orange;
66     }
67     .nav li {
68         float: left;
69         font: normal 20px/60px '微软雅黑';
70         padding: 0 30px;
71     }
72     .nav li:hover {
73         cursor: pointer;
74         background-color: aquamarine;
75     }
76     .nav li.active {
77         cursor: pointer;
78         background-color: aquamarine;
79     }
80 </style>
View Code

 

 

原文地址:https://www.cnblogs.com/zahngyu/p/11651482.html