Vue
漸進式 JavaScript 框架
通過對框架的了解與運用程度,來決定其在整個項目中的應用范圍,最終可以獨立以框架方式完成整個web前端項目
一、走進Vue
1、what -- 什么是Vue
可以獨立完成前后端分離式web項目的JavaScript框架
2、why -- 為什么要學習Vue
三大主流框架之一:Angular React Vue
先進的前端設計模式:MVVM
可以完全脫離服務器端,以前端代碼復用的方式渲染整個頁面:組件化開發
3、special -- 特點
單頁面web應用
數據驅動
數據的雙向綁定
虛擬DOM
4、how -- 如何使用Vue
- 開發版本:vue.js
- 生產版本:vue.min.js
<div id="app">
{{ }}
</div>
<script src="js/vue.min.js"></script>
<script>
new Vue({
el: '#app'
})
</script>
二、Vue實例
1、el:實例
new Vue({
el: '#app'
})
// 實例與頁面掛載點一一對應
// 一個頁面中可以出現多個實例對應多個掛載點
// 實例只操作掛載點內部內容
// el的值為css3選擇器,選擇結果為第一個,不會匹配其他的,所以一般用id選擇器
// html、body不能作為掛載點
2、data:數據
1、實例的數據屬性一般都在data中定義
2、在頁面中,插值表達式{{}}
可以引用變量的值,即vue實例的屬性值
3、在外部可以通過vue對象名.屬性
的方式獲取屬性值,在vue對象內部,通過this.屬性
的方式獲取屬性值
<div id='app'>
{{ msg }}
</div>
<script>
var app = new Vue({
el: '#app',
data: {
msg: '數據',
}
})
console.log(app.$data.msg);
console.log(app.msg);
</script>
3、methods:方法
<style>
.box { background-color: orange }
</style>
<div id='app'>
<p class="box" v-on:click="pClick">測試</p>
<p class="box" v-on:mouseover="pOver">測試</p>
</div>
<script>
var app = new Vue({
el: '#app',
methods: {
pClick () {
// 點擊事件的回調函數
},
pOver () {
// 懸浮事件的回調函數
}
}
})
</script>
<!-- 了解v-on:為事件綁定的指令 -->
<!-- methods為事件提供實現體-->
4、computed:計算
1、computed計算屬性可以聲明方法屬性,但是該方法屬性一定不能在data中重復聲明
2、該方法屬性必須在頁面中渲染,才會啟用該屬性綁定的方法,方法屬性的值就是綁定方法的返回值
3、在該方法中,所有的變量都會被監聽到,任何一個變量發生變化,都會觸發該綁定方法,從而更新方法屬性的值,不管這個值受不受到變化
<div id="app">
<input type="text" v-model="a">
<input type="text" v-model="b">
<div>
{{ c }}
</div>
</div>
<script>
// 一個變量依賴於多個變量
new Vue({
el: "#app",
data: {
a: "",
b: "",
},
computed: {
c: function() {
// this代表該vue實例
return this.a + this.b;
}
}
})
</script>
5、watch:監聽
<div id="app">
<input type="text" v-model="ab">
<div>
{{ a }}
{{ b }}
</div>
</div>
<script>
// 多個變量依賴於一個變量
new Vue({
el: "#app",
data: {
ab: "",
a: "",
b: "",
},
watch: {
ab: function() {
// 邏輯根據需求而定
this.a = this.ab[0];
this.b = this.ab[1];
}
}
})
</script>
6、delimiters:分隔符
<div id='app'>
${ msg }
</div>
<script>
new Vue({
el: '#app',
data: {
msg: 'message'
},
delimiters: ['${', '}']
})
</script>
三、生命周期鈎子
- 表示一個vue實例從創建到銷毀的這個過程,將這個過程的一些時間節點賦予了對應的鈎子函數
- 鈎子函數: 滿足特點條件被回調的方法
new Vue({
el: "#app",
data: {
msg: "message"
},
beforeCreate () {
console.log("實例創建之前");
console.log(this.msg
},
created () {
console.log("實例創建成功, data, methods已擁有");
console.log(this.msg);
},
beforeMounted () {
console.log("渲染頁面之前,data還可以更新")
console.log(this.msg);
},
mounted () {
console.log("頁面已被vue實例渲染, data, methods已更新");
}
// 拿到需求 => 確定鈎子函數 => 解決需求的邏輯代碼塊
})
四、Vue指令
1、文本相關指令
<div id="app">
<p>{{ msg }}</p> <!-- 插值表達式 -->
<p v-text='msg'>原文本</p> <!--原文本會被msg替換 -->
<p v-html='msg'></p> <!-- 可以解析帶html標簽的文本信息 -->
<p v-once>{{ msg }}</p> <!-- v-once控制的標簽只能被賦值一次 -->
</div>
<script type="text/javascript">
// 指令: 出現在html標簽中可以被vue解析處理的全局屬性
new Vue({
el: "#app",
data: {
msg: "message"
}
})
</script>
2、斗篷指令
<style type="text/css">
[v-cloak] { display: none; }
</style>
<div id="app" v-cloak>
{{ msg }}
</div>
<script src="js/vue.min.js"></script>
<script type="text/javascript">
new Vue({
el: "#app",
data: {
msg: "message"
}
})
</script>
<!-- 避免頁面閃爍-->
3、屬性指令
<!-- 給自定義全局屬性綁定變量 -->
<p v-bind:abc="abc"></p>
<!-- 以原字符串形式綁定全局屬性 -->
<p v-bind:title="'abc'"></p>
<!-- 單類名綁定 -->
<p v-bind:class="c1"></p>
<!-- 多類名綁定 -->
<p v-bind:class="[c2, c3]"></p>
<!-- 類名狀態綁定 -->
<p v-bind:class="{c4: true|false|var}"></p>
<!-- 多類名狀態綁定 -->
<p v-bind:class="[{c5: true}, {c6: flase}]"></p>
<!-- 樣式綁定 -->
<!--綁定變量-->
<div :style="div_style"></div>
<!--直接綁定值,屬性變為駝峰體-->
<div :style="{width: '100px', height: '100px', backgroundColor: 'blue'}"></div>
<script type="text/javascript">
new Vue({
el:"#app",
data: {
abc: "abc",
c1: "p1",
c2: "p2",
c3: "p3",
div_style: {
width: "200px",
height: "200px",
backgroundColor: "cyan"
}
}
})
</script>
<!-- v-bind: 指令可以簡寫為 : -->
4、事件指令
<!-- v-on: 指令 簡寫 @ -->
<!-- 不傳參事件綁定,但事件回調方法可以獲取事件對象 -->
<p @click="fn"></p>
<!-- ()可以傳入具體實參 -->
<p @click="fn()"></p>
<!-- ()情況下,事件對象應該顯式傳入 -->
<p @click="fn($event)"></p>
<!-- -->
5、表單指令
1、雙向綁定v-model:服務於文本輸入框
2、單選框:v-model存儲的值為單選框的value值
3、單一復選框:v-model存儲的值為true|false或自定義替換的值
4、多復選框:v-model存儲的值為多復選框value的數組,加入數組的順序是點擊選項的順序
<div id="app">
<!-- v-model針對於表單元素 -->
<form action="" method="get">
<!-- 1、雙向綁定:服務於文本輸入框 -->
<!-- v-model存儲的值為輸入框的value值 -->
<div>
<input type="text" name="usr" v-model="in_val">
<input type="password" name="ps" v-model="in_val" >
<textarea name="info" v-model="in_val"></textarea>
</div>
<!-- 2、單選框 -->
<div>
<!-- 單選框是以name進行分組,同組中只能發生單選 -->
<!-- v-model存儲的值為單選框的value值 -->
男:<input type="radio" name="sex" value="男" v-model="ra_val">
女:<input type="radio" name="sex" value="女" v-model="ra_val">
{{ ra_val }}
</div>
<!-- 3、單一復選框 -->
<!-- v-model存儲的值為true|false -->
<!-- 或者為自定義替換的值 -->
<div>
<input type="checkbox" v-model='sin_val' true-value="選中" false-value="未選中" />
{{ sin_val }}
</div>
<!-- 4、多復選框 -->
<!-- v-model存儲的值為多復選框value的數組 -->
<div>
<input type="checkbox" value="喜好男的" name="cless" v-model='more_val' />
<input type="checkbox" value="喜好女的" name="cless" v-model='more_val' />
<input type="checkbox" value="不挑" name="cless" v-model='more_val' />
{{ more_val }}
</div>
</form>
</div>
<script type="text/javascript">
new Vue({
el: '#app',
data: {
in_val: '',
// 默認值可以決定單選框默認選項
ra_val: '男',
// 默認值為true,單一復選框為選中,反之false為不選中
sin_val: '',
// 數組中存在的值對應的復選框默認為選中狀態
more_val: ['喜好女的','不挑']
}
})
</script>
6、條件指令
1、直接在標簽內書寫v-if="條件1"
或v-else-if="條件2"
或v-else
,滿足條件才會有該標簽,否則沒有該標簽
2、v-show="條件"
,條件為真,渲染,條件為假隱藏標簽,即令屬性display為none,實際上在前端是有該標簽的,不利於該標簽包裹的數據的保護,但是有利於狀態多變情況下的頁面渲染
<div id="app">
<button @click="toggle">顯隱切換</button>
<!-- v-if -->
<div class="box r" v-if="isShow"></div>
<!-- v-show -->
<div class="box o" v-show="isShow"></div>
<!-- 1.條件渲染的值為true|false -->
<!-- 2.true代表標簽顯示方式渲染 -->
<!-- 3.false v-if不渲染到頁面,v-show以display:none渲染到頁面,但也不會顯示 -->
<!-- v-if v-else-if v-else 案例 -->
<ul>
<li @mouseover="changeWrap(0)">red</li>
<li @mouseover="changeWrap(1)">green</li>
<li @mouseover="changeWrap(2)">blue</li>
</ul>
<!-- red頁面邏輯結構 -->
<div class="wrap red" v-if="tag == 0" key="0">...</div>
<!-- green頁面邏輯結構 -->
<div class="wrap green" v-else-if="tag == 1" key="1">...</div>
<!-- blue頁面邏輯結構 -->
<div class="wrap blue" v-else key="2">...</div>
<!-- v-if相關分支操作,在未顯示情況下,是不會被渲染到頁面中 -->
<!-- 通過key全局屬性操作后,渲染過的分支會建立key對應的緩存,提高下一次渲染速度 -->
<!-- v-show 案例 -->
<ul>
<li @mouseover="changeMain(0)">red</li>
<li @mouseover="changeMain(1)">green</li>
<li @mouseover="changeMain(2)">blue</li>
</ul>
<!-- red頁面邏輯結構 -->
<div class="main red" v-show="whoShow(0)">...</div>
<!-- green頁面邏輯結構 -->
<div class="main green" v-show="whoShow(1)">...</div>
<!-- blue頁面邏輯結構 -->
<div class="main blue" v-show="whoShow(2)">...</div>
</div>
<script type="text/javascript">
new Vue({
el: "#app",
data: {
isShow: false,
tag: 0,
flag: 0
},
methods: {
toggle () {
this.isShow = !this.isShow;
},
changeWrap (num) {
this.tag = num;
},
changeMain (num) {
// this.flag num
this.flag = num;
},
whoShow (num) {
// this.flag num
return this.flag == num;
}
}
})
</script>
7、循環指令
<!--
語法:v-for="item in items"
1、v-for遍歷數組或字符串時,v-for="v in arr|str" 或者v-for="(v,i) in arr|str"
2、v-for遍歷字典時,v-for="(v,k,i) in dic"
3、js中,字典的key是有序的,value是無序的
-->
<div id="app">
<h1>{{ msg }}</h1>
<!--列表-->
<ul>
<li v-for="(n, i) in list" :key="i">value:{{ n }} | index: {{ i }}</li>
</ul>
<!--字典-->
<ul>
<li v-for="(v, k, i) in dic" :key="k">value:{{ v }} | key:{{ k }} | index: {{ i }}</li>
</ul>
<!-- 遍歷的嵌套 -->
<div v-for="(person, index) in persons" :key="index" style="height: 21px;">
<div v-for="(v, k) in person" :key="k" style="float: left;">{{ k }} : {{ v }} </div>
</div>
</div>
<script type="text/javascript">
new Vue({
el: "#app",
data: {
msg: "列表渲染",
list: [1, 2, 3, 4, 5],
dic: {
name: 'zero',
age: 88888,
gender: 'god'
},
persons: [
{name: "zero", age: 8},
{name: "egon", age: 78},
{name: "liuXX", age: 77},
{name: "yXX", age: 38}
]
}
})
</script>
8、todolist案例
<div id="app">
<div>
<input type="text" v-model="val">
<button type="button" @click="submitMsg">提交</button>
</div>
<ul>
<li v-for="(v, i) in list" :key="i" @click="removeMsg(i)">{{ v }}</li>
</ul>
{{ list }}
</div>
<script type="text/javascript">
new Vue({
el: "#app",
data: {
val: "",
list: []
},
methods: {
submitMsg () {
if (this.val) {
this.list.push(this.val);
this.val = ""
}
},
removeMsg(index) {
this.list.splice(index, 1)
}
}
})
</script>
五、組件
- 每一個組件都是一個vue實例
- 每個組件均具有自身的模板template,根組件的模板就是掛載點
- 每個組件模板只能擁有一個根標簽
- 子組件的數據具有作用域,以達到組件的復用
1、根組件
<!--
1、通過new Vue創建的實例就是根組件(實例與組件一一對應,一個實例就是一個組件)
2、每個組件組件均擁有模板,template
3、模板:
指的是用字符串形式定義的具有唯一根標簽的html代碼塊,是組件成員template的值
如果template有非空值,就會替代組件的掛載點
-->
<div id="app">
<h1>{{ msg }}</h1>
</div>
<script type="text/javascript">
var app = new Vue({ // 使用new Vue()來定義組件就是根組件
el: "#app",
data : {
msg: "根組件"
},
template: "<div>顯式模板</div>" // 當template不為空時,就會替代掛載點
})
// app.$template
</script>
2、局部組件
<!--
1、子組件也是vue實例,擁有除了el之外的所有成員,子組件的所有名字只能通過組件本身控制
2、子組件通過成員template以字符串的形式定義真正的標簽
3、子組件通過成員data聲明變量,為了保證復用子組件后的數據互不影響,使用函數包裹每個被調用的組件的變量名
4、在根組件中使用子組件名為標簽調用子組件,若子組件是局部組件,則需要在根組件中注冊過才能調用
-->
<div id="app">
<local-tag></local-tag> <!--調用局部子組件-->
<local-tag></local-tag>
</div>
<script>
var localTag = { // 定義局部子組件
data () { // 聲明子組件的變量,並利用函數隔離相同組件的數據
return {
count: 0
}
},
template: '<button @click="btnAction">局部{{ count }}</button>', // 定義子組件的標簽
methods: {
btnAction () {
this.count ++
}
}
}
new Vue({
el: "#app",
components: {
'local-tag': localTag // 注冊子組件,只能調用注冊過的子組件
}
})
</script>
3、全局組件
<!--
1、全局組件也是子組件,必須在根組件之下才能調用
2、所有的跟組件都可以使用全部組件為子組件,不需要注冊,而局部組件需要注冊
3、除此之外,全局組件與局部組件沒有差別
-->
<div id="app">
<global-tag></global-tag>
<global-tag></global-tag>
</div>
<script>
Vue.component('global-tag', { // 定義全局組件
data () {
return {
count: 0
}
},
template: '<button @click="btnAction">全局{{ count }}</button>',
methods: {
btnAction () {
this.count ++
}
}
})
new Vue({ // 不需要注冊,就能調用全局組件
el: "#app"
})
</script>
4、父組件傳遞數據給子組件
- 通過綁定屬性的方式進行數據傳遞
<!--
1、根組件的標簽位置內,調用子組件時,它不是一個真正的標簽,知識作為一個占位,html頁面上真正的標簽時子組件調用后產生的真正的標簽
2、由於不是真正的標簽,因此它不具有標簽默認屬性,如style,class,name等等,包括事件也不能用
3、雖然不具有默認屬性,但是可以自定義屬性,包括自定義事件
4、自定義的屬性名需要在組件內的成員props列表中以字符串的形式聲明
5、自定義屬性的屬性值可以是父標簽的變量,也可以是常量,在子組件內,通過反射的方式利用屬性名獲取屬性值,即實現了父標簽傳遞數據給子標簽
-->
<div id="app">
<global-tag :sup_data1='sup_data1' :supData2='sup_data2'></global-tag>
</div>
<script type="text/javascript">
Vue.component('global-tag', {
props:['sup_data1', 'supdata2'], // 子組件內通過反射獲取字符串對應屬性值,不區分大小寫
template: '<div>{{ sup_data1 }} {{ supdata2 }}</div>'
})
new Vue({
el: '#app',
data: {
sup_data1: '數據1',
sup_data2: '數據2'
}
})
</script>
5、子組件傳遞數據給父組件
- 通過發送事件請求的方式進行數據傳遞
<!--
1、已經知道調用子組件時,可以自定義屬性,實現父組件向子組件的數據傳遞
2、也可以自定義事件,事件的觸發只能在子組件內部,事件的回調函數在父組件內聲明
3、事件的觸發:this.$emit('自定義的事件名', *args),主動觸發,args是回傳給回調函數的,可以是子組件的變量,可以是常量
4、事件的回調函數:'回調函數名'(*args){},args為子組件內觸發該自定義事件后,返回的數據,即實現了子組件向父組件的數據傳遞
-->
<div id="app">
<global-tag @send_action='receiveAction'></global-tag> <!--調用子組件時,自定義事件-->
</div>
<script type="text/javascript">
Vue.component('global-tag', {
data () {
return {
sub_data1: "數據1",
sub_data2: '數據2'
}
},
template: '<div @click="clickAction">發生</div>',
methods: {
clickAction () {
this.$emit('send_action', this.sub_data1, this.sub_data2)
// 主動觸發自定義的事件,並返回數據給自定義事件的回調函數
}
}
})
new Vue({
el: '#app',
methods: {
receiveAction (v1, v2) { // v1,v2為子組件觸發事件時傳遞的數據
console.log(v1, v2)
}
}
})
</script>
6、父子組件實現todoList
<div id="app">
<div>
<input type="text" v-model="val">
<button type="button" @click="submitMsg">提交</button>
</div>
<ul>
<!-- <li v-for="(v, i) in list" :key="i" @click="removeMsg(i)">{{ v }}</li> -->
<todo-list v-for="(v, i) in list" :key="i" :v="v" :i="i" @delect_action="delect_action"></todo-list>
</ul>
</div>
<script type="text/javascript">
Vue.component("todo-list", {
template: "<li @click='delect_action'><span>第{{ i + 1 }}條: </span><span>{{ v }}</span></li>",
props: ['v', 'i'],
methods: {
delect_action () {
this.$emit("delect_action", this.i)
}
}
})
new Vue({
el: "#app",
data: {
val: "",
list: []
},
methods: {
submitMsg () {
// 往list中添加input框中的value
if (this.val) {
this.list.push(this.val);
this.val = ""
}
},
delect_action(index) {
this.list.splice(index, 1)
}
}
})
</script>
六、Vue-CLI 項目搭建
1、環境搭建
- 安裝node
官網下載安裝包,傻瓜式安裝:https://nodejs.org/zh-cn/
- 安裝cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 安裝腳手架
cnpm install -g @vue/cli
- 清空緩存處理
npm cache clean --force // 當前面步驟出問題時,嘗試此操作
2、項目的創建
- 創建項目
vue creat 項目名
// 要提前進入目標目錄(項目應該創建在哪個目錄下)
// 選擇自定義方式創建項目,選取Router, Vuex,babel插件 空格選擇,enter確定
- 啟動/停止項目
npm run serve / ctrl+c
// 要提前進入項目根目錄
- 打包項目
npm run build
// 要在項目根目錄下進行打包操作
3、認識項目
- 項目目錄
dist: 打包的項目目錄(打包后會生成)
node_modules: 項目依賴
public: 共用資源
src: 項目目標,書寫代碼的地方
-- assets:資源
-- components:組件
-- views:視圖組件
-- App.vue:根組件
-- main.js: 入口js
-- router.js: 路由文件
-- store.js: 狀態庫文件
vue.config.js: 項目配置文件(沒有可以自己新建)
- 配置文件:vue.config.js
module.exports={
devServer: {
port: 8888
}
}
// 修改端口,選做
- main.js
// 這是項目的入口文件
// 加載項目環境,如Vue環境,router路由環境,store代碼庫環境
// render,由系統啟動,將根組件APP作為參數,解析成html替換跟組件的掛載點
// 掛載el為"#app"
// 加載環境只需要from即可,使用import得到的名字,可以在后面繼續使用
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
Vue.config.productionTip = false; // 新建項目tips
new Vue({
router,
store,
render: h => h(App) //箭頭函數,
}).$mount('#app'); // 組件的聲明周期,鈎子函數mount,渲染標簽成html
- .vue文件
<!--
1、views文件夾存放頁面組件,一般作為根組件的子組件
2、components文件夾存放小組件,一般作為頁面組件的子組件
3、在使用組件的地方,要導入組件,並注冊組件
-->
<template>
<!-- 模板區域 -->
</template>
<script>
// 邏輯代碼區域
// 該語法和script綁定出現
export default { // 使用export default語法,該組件才能被導出調用
}
</script>
<style scoped>
/* 樣式區域 */
/* scoped表示這里的樣式只適用於組件內部, scoped與style綁定出現 */
</style>
4、項目功能
- vue-router
{
path: '/',
name: 'home',
// 路由的重定向
redirect: '/home'
}
{
// 一級路由, 在根組件中被渲染, 替換根組件的<router-view/>標簽
path: '/one-view',
name: 'one',
component: () => import('./views/OneView.vue')
}
{
// 多級路由, 在根組件中被渲染, 替換根組件的<router-view/>標簽
path: '/one-view/one-detail',
component: () => import('./views/OneDetail.vue'),
// 子路由, 在所屬路由指向的組件中被渲染, 替換該組件(OneDetail)的<router-view/>標簽
children: [{
path: 'show',
component: () => import('./components/OneShow.vue')
}]
}
<!-- router-link渲染為a標簽 -->
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link> |
<router-link :to="{name: 'one'}">One</router-link> |
<!-- 為路由渲染的組件占位 -->
<router-view />
/*激活的router-link標簽*/
a.router-link-exact-active {
color: #42b983;
}
// router的邏輯轉跳:push({})
this.$router.push('/one-view')
// 帶參數的邏輯跳轉
this.$router.push({name: '路由名', query: {拼接的參數}})
// router采用history方式訪問上一級
this.$router.go(-1)
- vuex
// 在任何一個組件中,均可以通過this.$store.state.msg訪問msg的數據
// state永遠只能擁有一種狀態值
state: {
msg: "狀態管理器"
},
// 讓state擁有多個狀態值
mutations: {
// 在一個一個組件中,均可以通過this.$store.commit('setMsg', new_msg)來修改state中的msg
setMsg(state, new_msg) {
state.msg = new_msg
}
},
// 讓mutations擁有多個狀態值
actions: {
}
- vue-cookie
// 安裝cookie的命令
// npm install vue-cookie --save
// 為項目配置全局vue-cookie
import VueCookie from 'vue-cookie'
// 將插件設置給Vue原型,作為全局的屬性,在任何地方都可以通過this.$cookie進行訪問
Vue.prototype.$cookie = VueCookie
// 持久化存儲val的值到cookie中
this.$cookie.set('val', this.val)
// 獲取cookie中val字段值
this.$cookie.get('val')
- axios
// 安裝 axios(ajax)的命令
// npm install axios--save
// 為項目配置全局axios
import Axios from 'axios'
Vue.prototype.$ajax = Axios
let _this = this
this.$ajax({
method: 'post',
url: 'http://127.0.0.1:5000/loginAction',
params: {
usr: this.usr,
ps: this.ps
}
}).then(function(res) {
// this代表的是回調then這個方法的調用者(axios插件),也就是發生了this的重指向
// 要更新頁面的title變量,title屬於vue實例
// res為回調的對象,該對象的data屬性就是后台返回的數據
_this.title = res.data
}).catch(function(err) {
window.console.log(err)
})
# 用pycharm啟動該文件模擬后台
from flask import Flask, request, render_template
from flask_cors import CORS
app = Flask(__name__)
CORS(app, supports_credentials=True)
@app.route('/')
def index():
return "<h1>主頁</h1>"
@app.route('/loginAction', methods=['GET', 'POST'])
def test_action():
# print(request.args)
# print(request.form)
# print(request.values)
usr = request.args['usr']
ps = request.args['ps']
if usr != 'abc' or ps != '123':
return 'login failed'
return 'login success'
if __name__ == '__main__':
app.run()
5、創建vue項目的流程
1、在main.js文件內加載項目環境和解析根組件,並渲染到網頁
/*
1 加載vue、router、store環境
2 導入根組件APP
3 render解析根組件並渲染到網頁
*/
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');
2、在根組件內加載頁面組件
/*
1 加載頁面組件的方式:
<router-link to="頁面組件的路由">Home</router-link>
2 被加載的頁面組件,需要在router文件夾下的index.js文件中注冊路由,在1中通過to="頁面組件的路由"的方式實現頁面組件的路由跳轉
3 頁面組件和小組件都需要使用導出語句定義實例,才能被其他文件導入,如下
*/
export default {
name: 'home',
components: {
HelloWorld,
}
}
3、頁面組件的路由注冊,在index.js中完成
/*
1 導入頁面組件
2 在const routes中注冊頁面路由
3 注冊方式:
{
path: '路由',
name: '路由名',
component: 頁面組件名
},示例如下js代碼
*/
{
path: '/',
name: 'home',
component: Home
},
4、在頁面組件內調用標簽組件
/*
1 導入要調用的標簽組件
2 在本頁面組件的定義內,注冊所有要用的小組件
*/
// 導入組件
import HelloWorld from '@/components/HelloWorld.vue'
export default {
name: 'home',
components: {
HelloWorld, // 注冊
}
}
5、小組件的定義
/*
1 同樣的組件定義方式,export語法
2 props成員,可以使用列表的形式,也可以使用如下的形式
根據屬性值的類型,以鍵值對的方式,鍵為屬性名,值為值數據類型
props:{
msg:String,
info: Array,
info1: Object,
info2: JSON,
date: Date,
}
*/