漸進式的JavaScript框架html
漸進式:能夠控制一個頁面的標籤,也能夠控制一系列標籤,也能夠控制整個頁面,甚至能夠控制整個前端項目前端
做用:開發先後臺分離項目vue
通俗來說:python
有指令(分支結構,循環結構...),複用頁面結構等後端
有實例成員(過濾器,監聽),能夠對渲染的數據作二次格式化前端框架
有組件(模塊的複用與組合),快速搭建頁面app
特色:框架
虛擬DOM,直接加載的到內存中,加載速度更快前後端分離
數據的雙向綁定,監聽機制函數
單頁面應用,適配移動端項目
數據驅動
前端框架主要有三種:Angular(龐大),React(精通移動端),vue(吸收前二者的優點,輕量級的)
還有vue是中國人開發的,一手文檔是中文的
通常如今不少都實現先後端分離開發,爲了節約開發成本
通常將導入和寫vue代碼都寫在HTML中的/body>與</html 中間
兩種方式:一、CDN導入,二、本地導入
<!-- 一、cdn導入 --> <script src="https://cn.vuejs.org/js/vue.js"></script> <!-- 二、本地導入--> <script src="js/vue.js"></script>
一個掛載點el只能控制一個頁面結構(優先匹配到的結構)
掛載點掛載的頁面標籤嚴格建議用 id 屬性進行匹配(通常習慣用app),由於id惟一
html標籤與body標籤不能做爲掛載點
是否接受vue對象,是根據外界是否有vue對象內容決定的
<body> <div id="app"> <div class="d1"> <!-- 插值表達式--> {{ num }} </div> <div class="d1"> {{ num }} </div> </div> <div id="main">{{ n }}</div> </body> <!--cdn導入--> <!--<script src="https://cn.vuejs.org/js/vue.js"></script>--> <!--本地導入--> <script src="js/vue.js"></script> <script> // 聲明變量app = vue對象 var app = new Vue({ // 掛載點el,只能控制一個頁面結構,顧用id el: '#app', // 在body中寫的插值表達式中的變量在data中初始化 data: { num: 100 } }); // 是否接受vue對象,是根據外界是否有vue對象的內容決定 new Vue({ el: '#main', data:{ n:app.num } }); // 打印掛載點中全部的內容,即div>app全部渲染過的代碼 console.log(app.$el); console.log(app.num); // 100 console.log(app.$data.num) // 100 </script>
空插值表達式:{{ }}
插值表達式中渲染的變量在data中能夠初始化
插值表達式中能夠進行簡單的運算與邏輯
當插值表達式與Django模板語法衝突時,可使用delimiters自定義
<body> <div id="app"> <p>{{ msg }}</p> <p>{{ }}</p> <p>{{ num }}</p> <p>{{ num + 10 }}</p> <!-- 可使用字符串的方法--> <p>{{ msg.length + num }}</p> <!-- 索引4的值--> <p>{{ msg[4] }}</p> <!-- 按照空格切分後是列表--> <p>{{ msg.split('') }}</p> <!-- 更換插值表達式標識符--> <p>[{ msg }]</p> </div> </body> <script src="js/vue.js"></script> <script> new Vue({ el: '#app', data: { msg: 'message', num: 10 }, // 更換插值表達式標識符 delimiters: ['[{ ', ' }]'] }) </script>
用實例成員filters來定義過濾器
在頁面結構中,用 | 來標識使用過濾器
必需要有一個返回值,過濾方法的返回值就是過濾器過濾後的結果
過濾器能夠對1~n個變量進行過濾,同時能夠傳入輔助的變量,過濾器接收參數是按照傳入的位置前後
<body> <div id="app"> <!-- 簡單使用: 過濾器對象做爲第一個參數傳給過濾器,過濾器能夠傳入輔助的參數--> <p>{{ num|add(20) }}</p> <!-- 串聯使用:將第一個過濾器結果當作第一個參數傳入第二個過濾器中--> <p>{{num|add(10) | jump(2) }}</p> <!-- 過濾器方法接收的參數按照傳入的位置前後傳入--> <p>{{ n1, n2 | fn(100, 200) }}</p> <p>{{n1, n2 | fn(10, 20), n1, n2 | fn(100) }}</p> </div> </body> <script src="js/vue.js"></script> <script> new Vue({ el: '#app', data:{ num: 10, n1: 20, n2: 30 }, filters: { add: function (a, b) { console.log(a, b); return a + b }, jump: function (a, b) { return a*b }, fn: function (a, b, c, d) { console.log(a, b, c, d); return a + b + c + d } } }) </script>
v-* 是vue指令,會被vue解析,v-text="num"中的num是變量
v-text是原樣輸出渲染內容,渲染控制的標籤自身內容會被替換掉(<p v-text="num">123</p>中的123會被num替換)
v-html能夠解析渲染HTML語法的內容
js基本數據類型:字符串,數字,布爾,undefined
<body> <div id="app"> <p>{{ num | add(300) }}</p>
<!-- 相似{{ num }}--> <p v-text="num"></p> <!-- 渲染控制的標籤自身內容123會被替換--> <p v-text="num">123</p> <!-- v-text原樣渲染,v-html會解析HTML語法--> <p v-text="info"></p> <p v-html="info"></p> <!-- js基本數據類型:字符串,布爾,數字,undefined--> <!-- 插值表達式中引號是字符串,不寫表明變量--> <p>{{ 'abc' + 10 + num }}</p> <!-- 文本指令中字符串須要寫在引號中再加引號--> <p v-text=" 'abc' + 10 + num "></p> </div> </body> <script src="js/vue.js"></script> <script> new Vue({ el: '#app', data: { num: 100, info: '<i style="color: red">info</i>', }, filter:{ add: function (a, b) { return a+b; } } }) </script>
一、DOM驅動
js選擇器獲取目標標籤
爲目標標籤綁定事件
在事件中完成相應的邏輯
var btn = document.getElementsByTagName('button')[0]; btn.onclick = function () { console.log(111111111111); };
二、數據驅動
操做一個功能,使用須要一個方法來看控制
方法名是變量,因此控制變量就能夠控制方法
三、事件指令
在實例成員methods中聲明事件方法
標籤經過事件指令綁定聲明的辦法:v-on:事件名="事件方法名"
<button v-on:click="btnClick">按鈕</button>
標籤經過事件指令綁定聲明的方法,且能夠自定義傳參數:v-on:事件名="事件方法名( )"
<button v-on:click="btnClick()">按鈕</button> 不傳任何參數 <button v-on:click="btnClick($event)">按鈕</button> 傳入事件對象,跟不寫括號相同 <button v-on:click="btnClick(10)">按鈕</button> 只傳入自定義參數,固然也能夠傳入事件對象加自定義參數
<body> <div id="app"> <!-- 標籤中聲明綁定的方法,不加括號--> <button v-on:click="btnClick">{{ btn1 }}</button> <hr> <!-- 直接綁定事件名:系統會觸發事件時調用事件方法,傳給事件方法的一個參數(事件對象)--> <button v-on:click="fn1">{{ btn3 }}</button> <!-- 綁定的事件後跟着(),不是主動調用事件方法,而是表示在觸發事件調用時,傳入的參數全由用戶本身決定--> <button v-on:click="fn2($event, 10, 20)">{{ btn4 }}</button> <hr> <button v-on:click="fn(btn1)">{{ btn1 }}</button> <button v-on:click="fn(btn2)">{{ btn2 }}</button> </div> </body> <script src="js/vue.js"></script> <script> new Vue({ el: '#app', data:{ btn1: '按鈕1', btn2: '按鈕2', btn3: '按鈕3', btn4: '按鈕4', }, methods: { btnClick() { console.log(666) }, fn1(ev) { console.log(ev.clientX, ev.clientY) }, fn2(ev, n1 ,n2) { console.log(ev.clientX, ev.clientY) }, fn(msg) { console.log(msg) } } }) </script>
一、普通對象與對象簡寫
js沒有字典類型,只有對象類型,對象能夠徹底替代字典來使用
// 對象屬性替代python中字典類型 var dic_obj = { 'name': 'Bob', 'eat': function () { console.log('在吃飯') } }; // 能夠直接利用對象.的方式取值或者字典取值方式取值 console.log(dic_obj.name, dic_obj['name']); dic_obj.eat(); // 獲得函數地址加括號調用 dic_obj['eat']()
js中對象的屬性名,都採用字符串類型,因此能夠省略字符串的引號標識
// 屬性能夠省略引號 var dic_obj2 = { name: 'Tom', 'eat': function () { console.log('在吃飯...') } }; // 能夠直接利用對象.的方式取值或者字典取值方式取值 console.log(dic_obj.name, dic_obj['name']); dic_obj.eat(); // 獲得函數地址加括號調用 dic_obj['eat']()
對象中屬性值爲函數時,稱之爲方法,方法建議簡寫:方法名(){ }
若是對象中的屬性值是一個變量,且變量名與屬性名相同,還能夠簡寫:{屬性,}
var height = 180; var p={ // 上面定義了就直接簡寫 height, // 省略引號 name: 'Tank', // 對象中屬性爲函數時,方法簡寫 eat(){} }; console.log(p.height, p.name)
二、第一種類(瞭解)
// js中的類 // 第一種聲明類的方法 class People { constructor (name) { this.name = name } eat () { console.log(this.name + '在吃飯') } } let p1 = new People('Bob'); let p2 = new People('Tom'); console.log(p1.name, p2.name); p1.eat();
三、第二種類(瞭解)
在函數內部出現了this語法,這個函數就是類,不然就是普通函數
// 第二種聲明類的方法(難點):在函數內部出現了this語法,該函數就是類,不然就是普通函數 function Teacher(name) { this.name = name; this.eat =function () { console.log(this.name + '在吃飯') } } let t1 = new Teacher('Owen'); t1.eat();
四、類屬性
// 類屬性:給類屬性賦值,全部對象都能訪問 function Fn() {} let f1 = new Fn(); let f2 = new Fn(); // 賦值類屬性 Fn.prototype.num = 100; console.log(f1.num); console.log(f2.num); // 相似於單例(給類Vue加屬性num) Vue.prototype.num = 1000; let v1 = new Vue(); let v2 = new Vue(); console.log(v1.num); console.log(v2.num);
一、函數的形參與調用時傳入的實參關係
傳入和接收的參數個數不須要一致
可是要按照位置順序賦值,沒有關鍵字參數
沒有賦值的形參會被賦值undefined,沒有傳入的實參會被遺棄
function fn1(a,b) { console.log(a, b); // 1 2 return a+b; } // 傳多了3會被遺棄 let res = fn1(1, 2, 3); console.log(res); // 3 // 傳少了形參未被傳的被賦值undefined let p = fn1(1); console.log(p) // NaN 由於a=1, b=undefind相加不是數字
二、函數定義的演變
// 定義函數(相似於匿名函數,起名字) let fn2 = function (a, b) { return a+b; }; // 省略關鍵字的箭頭函數 let fn3 = (a, b) => { return a+b; }; // 沒有函數體,只有返回值的函數能夠省略做用域{},return也能夠省略 let fn4 = (a, b) => a+b; // 若是形參只有一個時,()也能夠省略 let fn5 = num => num*num
三、js是弱語言
// 加法變字符串 console.log(10 + '5'); // 105 // 減法變數字 console.log(10 - '5'); // 5 // 將存數字字符串變數字前面加一個+ console.log(+'55555'); // 55555