文章目錄
- 前端
- ES6
- let&&const
- 解構運算式
- 函式優化
- 物件優化
- map和reduce
- promise
- 模塊化
- Vue
- 基礎案例
- v-text、v-html.html
- 插值運算式
- 單向系結v-bind
- 雙向系結v-model
- v-on
- v-for
- v-if和v-show
- v-else和v-else-if
- 計算屬性和偵聽器
- 過濾器
- 組件化
- 生命周期鉤子函式
- 使用Vue腳手架進行開發
- 使用element-ui
谷粒商城_01_環境搭建
谷粒商城_02_Nacos、網關
前端
- 前后端對比

ES6
ECMAScript6.0(以下簡稱ES6,ECMAScript是一種由Ecma國際通過ECMA-262標準化的腳本),是JavaScript語言的下一代標準,2015年6月正式發布,從ES6開始的版本號采用年號,如ES2015,就是ES6,ES2016就是ES7,ECMAScript是規范,JS的規范的具體實作,
- vscode打開檔案夾,創建es6檔案夾打開
- 在es6檔案中,創建檔案,shift+! 回車快速生成html
- 右鍵—Open with Live Server打開瀏覽器查看
- shift+alt+f 整理代碼
let&&const
- var在{}之外也起作用,類似全域變數,let在{}之外不起作用
- var多次宣告同一變數不會報錯,let多次宣告會報錯,只能宣告一次,
- var 會變數提升(列印和定義可以順序反),let 不存在變數提升(順序不能反)
- const宣告之后不允許改變
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// var 宣告的變數往往會越域
// let 宣告的變數有嚴格區域作用域
// {
// var a = 1;
// let b = 2;
// }
// console.log(a); // 1
// console.log(b); // ReferenceError: b is not defined
// var 可以宣告多次
// let 只能宣告一次
// var m = 1
// var m = 2
// let n = 3
// let n = 4
// console.log(m) // 2
// console.log(n) // Identifier 'n' has already been declared
// var 會變數提升
// let 不存在變數提升
// console.log(x); // undefined
// var x = 10;
// console.log(y); //ReferenceError: y is not defined
// let y = 20;
// const
// 1. const宣告之后不允許改變
// 2. 一但宣告必須初始化,否則會報錯
const a = 1;
a = 3; //Uncaught TypeError: Assignment to constant variable.
</script>
</body>
</html>
解構運算式
- 陣列解構:支持let arr = [1,2,3]; let [a,b,c] = arr;
- 物件解構:const { name: abc, age, language } = person; 冒號代表改名
- 字串函式: 支持一個字串為多行 占位符功能 ${}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// 陣列解構
// let arr = [1,2,3];
// // let a = arr[0];
// // let b = arr[1];
// // let c = arr[2];
// let [a,b,c] = arr;
// console.log(a,b,c) // 1,2,3
const person = {
name: "jack",
age: 21,
language: ['java', 'js', 'css']
}
// const name = person.name;
// const age = person.age;
// const language = person.language;
// 物件解構
const { name: abc, age, language } = person;
console.log(abc, age, language) // jack,21,['java', 'js', 'css']
// 字串擴展
let str = "hello.vue";
console.log(str.startsWith("hello"));// 是否以hello開始:true
console.log(str.endsWith(".vue"));// 是否以.vue結尾:true
console.log(str.includes("e"));// 是否包含e:true
console.log(str.includes("hello"));// 是否包含hello:true
// 字串模板,多行字串 ``
let ss = `<div>
<span>hello world<span>
</div>`
console.log(ss); // 這里的字串是什么樣就列印什么樣的,空格也算
// 字串插入變數和運算式,變數名寫在 ${} 中,${} 中可以放入 JavaScript 運算式,
function fun() {
return "這是一個函式"
}
let info = `我是${abc},今年${age + 10}了, 我想說: ${fun()};`
console.log(info); // 我是jack,今年31了, 我想說: 這是一個函式
</script>
</body>
</html>
函式優化
- 原來想要函式默認值得這么寫 b = b || 1 ;
- 現在可以直接寫了:function add(a, b = 1) { }
- 函式不定引數:function fun(…values) { }
- 支持箭頭函式(lambda運算式)
- 還支持使用{}結構傳入物件的成員
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
//在ES6以前,我們無法給一個函式引數設定默認值,只能采用變通寫法:
function add(a, b) {
// 判斷b是否為空,為空就給默認值1
b = b || 1;
return a + b;
}
// 傳一個引數
console.log(add(10)); // 11
//現在可以這么寫:直接給引數寫上默認值,沒傳就會自動使用默認值
function add2(a, b = 1) {
return a + b;
}
console.log(add2(20)); // 21
//不定引數
function fun(...values) {
console.log(values.length)
}
fun(1, 2) //2
fun(1, 2, 3, 4) //4
// 箭頭函式
// 以前宣告一個方法
// var print = function (obj) {
// console.log(obj);
// }
var print = obj => console.log(obj);
print("hello"); // hello
// var sum = function (a, b) {
// c = a + b;
// return a + c;
// }
var sum2 = (a, b) => a + b;
console.log(sum2(11, 12)); // 23
var sum3 = (a, b) => {
c = a + b;
return a + c;
}
console.log(sum3(10, 20)) // 40
const person = {
name: "jack",
age: 21,
language: ['java', 'js', 'css']
}
function hello(person) {
console.log("hello," + person.name) // hello,jack
}
//箭頭函式+解構
var hello2 = (obj) => console.log("hello," +obj.name);
hello2(person); // hello,jack
var hello3 = ({name}) => console.log("hello," +name);
hello3(person); // hello,jack
</script>
</body>
</html>
物件優化
- 可以獲取map的鍵值對的資訊,Object.keys()、values、entries
- Object.assgn(target,source1,source2) 合并為 target
- const person2 = { age, name } :屬性名和值相同可以宣告物件簡寫
- 物件的函式屬性簡寫
- …代表取出該物件所有屬性拷貝到當前物件,let someone = { …p1 }
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
const person = {
name: "jack",
age: 21,
language: ['java', 'js', 'css']
}
console.log(Object.keys(person));
// ["name", "age", "language"]
console.log(Object.values(person));
// ["jack", 21, Array(3)] // ['java', 'js', 'css']
console.log(Object.entries(person));
// [Array(2), Array(2), Array(2)]
// 0: (2) ['name', 'jack']、1: (2) ['age', 21]、2: (2) ['language', Array(3)]
const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };
// target為目標物件,將其中的合并
Object.assign(target, source1, source2);
console.log(target); // {a:1,b:2,c:3}
// 宣告物件簡寫
const age = 23
const name = "張三"
const person1 = { age: age, name: name } // {age: 23, name: '張三'}
const person2 = { age, name }// 如果屬性名和值相同的就可以,宣告物件簡寫
console.log(person2);
// 物件的函式屬性簡寫
let person3 = {
name: "jack",
// 以前:
eat: function (food) {
console.log(this.name + "在吃" + food);
},
// 箭頭函式this不能使用,物件.屬性
eat2: food => console.log(person3.name + "在吃" + food),
eat3(food) {
console.log(this.name + "在吃" + food);
}
}
person3.eat("香蕉"); // jack在吃香蕉
person3.eat2("蘋果"); // jack在吃蘋果
person3.eat3("橘子"); // jack在吃橘子
// 物件拓展運算子
// 拷貝物件(深拷貝)
let p1 = { name: "Amy", age: 15 }
let someone = { ...p1 }
console.log(someone) //{name: "Amy", age: 15}
// 合并物件
let age1 = { age: 15 }
let name1 = { name: "Amy" }
let p2 = {name:"zhangsan"}
p2 = { ...age1, ...name1 }
console.log(p2) // {age: 15, name: 'Amy'}
</script>
</body>
</html>
map和reduce
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// 陣列中新增了map和reduce方法,
// map():接收一個函式,將原陣列中的所有元素用這個函式處理后放入新陣列回傳,
let arr = ['1', '20', '-5', '3'];
// arr = arr.map((item)=>{
// return item*2
// });
arr = arr.map(item=> item*2);
console.log(arr); // [2, 40, -10, 6]
// reduce() 為陣列中的每一個元素依次執行回呼函式,不包括陣列中被洗掉或從未被賦值的元素,
// [2, 40, -10, 6]
// arr.reduce(callback,[initialValue])
/**
1、previousValue (上一次呼叫回呼回傳的值,或者是提供的初始值(initialValue))
2、currentValue (陣列中當前被處理的元素)
3、index (當前元素在陣列中的索引)
4、array (呼叫 reduce 的陣列)
*/
let result = arr.reduce((a,b)=>{
console.log("上一次處理后:"+a);
console.log("當前正在處理:"+b);
return a + b;
},100); // 初始值100開始+
console.log(result)
/**
上一次處理后:100
當前正在處理:2
上一次處理后:102
當前正在處理:40
上一次處理后:142
當前正在處理:-10
上一次處理后:132
當前正在處理:6
138
*/
</script>
</body>
</html>
promise
- 以前嵌套ajax的時候很繁瑣,
- 解決方案: 把Ajax封裝到Promise中,賦值給let p 在Ajax中成功使用resolve(data),交給then處理, 失敗使用reject(err),交給catch處理p.then().catch()
// 創建json檔案:corse_score_10.json 課程10的分數
{
"id": 100,
"score": 90
}
// user.json 用戶
{
"id": 1,
"name": "zhangsan",
"password": "123456"
}
// user_corse_1.json 用戶1的課程
{
"id": 10,
"name": "chinese"
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<script>
//1、查出當前用戶資訊
//2、按照當前用戶的id查出他的課程
//3、按照當前課程id查出分數
// 三個json檔案的呼叫,會非常復雜
// $.ajax({
// url: "mock/user.json",
// success(data) {
// console.log("查詢用戶:", data);
// $.ajax({
// url: `mock/user_corse_${data.id}.json`,
// success(data) {
// console.log("查詢到課程:", data);
// $.ajax({
// url: `mock/corse_score_${data.id}.json`,
// success(data) {
// console.log("查詢到分數:", data);
// },
// error(error) {
// console.log("出現例外了:" + error);
// }
// });
// },
// error(error) {
// console.log("出現例外了:" + error);
// }
// });
// },
// error(error) {
// console.log("出現例外了:" + error);
// }
// });
// 1、Promise可以封裝異步操作
let p = new Promise((resolve, reject) => { //傳入成功決議,失敗拒絕
//1、異步操作
$.ajax({
url: "mock/user.json",
// 成功
success: function (data) {
console.log("查詢用戶成功:", data)
resolve(data);
},
// 失敗
error: function (err) {
reject(err);
}
});
});
// 成功以后做什么,成功后呼叫then,將data往里面傳
p.then((obj) => {
return new Promise((resolve, reject) => {
// 繼續異步操作
$.ajax({
url: `mock/user_corse_${obj.id}.json`,
success: function (data) {
console.log("查詢用戶課程成功:", data)
resolve(data);
},
error: function (err) {
reject(err)
}
});
})
}).then((data) => { // 成功以后繼續操作
console.log("上一步的結果", data)
// 繼續異步操作
$.ajax({
url: `mock/corse_score_${data.id}.json`,
success: function (data) {
console.log("查詢課程得分成功:", data)
},
error: function (err) {
}
});
})
// 抽取上面的流程,定義一個方法,來發請求的方法
function get(url, data) { // 自己定義一個方法整合一下
return new Promise((resolve, reject) => {
$.ajax({
url: url,
data: data,
success: function (data) {
resolve(data);
},
error: function (err) {
reject(err)
}
})
});
}
// 遞回呼叫方法
get("mock/user.json")
.then((data) => {
console.log("用戶查詢成功~~~:", data)
return get(`mock/user_corse_${data.id}.json`);
})
.then((data) => {
console.log("課程查詢成功~~~:", data)
return get(`mock/corse_score_${data.id}.json`);
})
.then((data)=>{
console.log("課程成績查詢成功~~~:", data)
})
.catch((err)=>{ //失敗的話catch
console.log("出現例外",err)
});
</script>
</body>
</html>
模塊化
- 模塊化就是把代碼進行拆分,方便重復利用,
- 類似于java中的導包, 而JS換了個概念,是導模塊,
- 模塊功能主要有兩個命令構成 export 和import
- export用于規定模塊的對外介面 :不僅可以匯出物件,一切JS變數都可以匯出,比如:基本型別變數、函式、陣列、物件,
- import用于匯入其他模塊提供的功能,匯入的時候,如果該js匯出沒有宣告變數名(比如:export default{,,}),則可以隨意起名,反之不行
// user.js
var name = "jack"
var age = 21
function add(a,b){
return a + b;
}
export {name,age,add}
// hello.js
// export const util = {
// sum(a, b) {
// return a + b;
// }
// }
export default {
sum(a, b) {
return a + b;
}
}
// export {util}
//`export`不僅可以匯出物件,一切JS變數都可以匯出,比如:基本型別變數、函式、陣列、物件,
// main.js
// 匯入的時候,如果該js匯出沒有宣告變數名(比如:export default{,,}),則可以隨意起名,反之不行
import abc from "./hello.js"
import {name,add} from "./user.js"
abc.sum(1,2); // 3
console.log(name); // jack
add(1,3); // 4
Vue
官網:https://cn.vuejs.org/v2/guide/
- MVVM思想
- M:model 包括資料和一些基本操作
- V:view 視圖,頁面渲染結果
- VM:View-model,模型與視圖間的雙向操作(無需開發人員干涉)
- 視圖和資料通過VM系結起來,model里有變化會自動地通過Directives填寫到視view中,
- 視圖表單中添加了內容也會自動地通過DOM Listeners保存到模型中,
基礎案例
-
可以直接匯入CDN:
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> -
使用npm安裝vue:進入專案路徑終端:
npm init -y:初始化、npm install vue安裝vue,注意專案名不能和vue同名 -
然后創建html頁面就可以使用,有什么語法不懂就復制代碼看運行結果就容易懂了
-
在VSCode中安裝vue 2 snippets語法提示插件,在谷歌瀏覽器中安裝vue.js devtools:
-
谷歌應用商店:https://chrome.google.com/webstore/category/extensions 搜索Vue.js devtools
v-xx:指令
? 1、創建vue實體,關聯頁面的模板,將自己的資料(data)渲染到關聯的模板,回應式的
? 2、指令來簡化對dom的一些操作,
? 3、宣告方法來做更復雜的操作,methods里面可以封裝方法,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!--匯入依賴 -->
<script src="./node_modules/vue/dist/vue.js"></script>
<div id="app">
<input type="text" v-model="num">
<!-- v-model實作雙向系結 -->
<!-- v-on:click系結事件,實作自增 -->
<button v-on:click="num++">點贊</button>
<!-- 回到自定義的方法 -->
<button v-on:click="cancel()">取消</button>
<h1> {{name}} ,非常帥,有{{num}}個人為他點贊{{hello()}}</h1>
</div>
<script>
// 1、vue宣告式渲染
let vm = new Vue({ // 生成vue物件,vue中的el、data、methods
el: "#app",// 系結元素 div id="app"
data: { // 封裝資料
name: "張三", // 也可以使用{{}} 表單中可以取出
num: 1
},
methods: { // 封裝方法
cancel() {
this.num--;
},
hello() {
return "1"
}
}
});
// 2、雙向系結:v-model,模型變化,視圖變化,反之亦然,
// 3、事件處理:v-on:click
// 還可以在html控制臺實時操作vm中的屬性:vm.name
</script>
</body>
</html>
v-text、v-html.html
- v-html:可以轉義html標簽
- v-text:可以解決延遲加載閃爍問題
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script src="../node_modules/vue/dist/vue.js"></script>
<div id="app">
{{msg}} {{1+1}} {{hello()}} <br/>
<!-- 用v-html取內容 -->
<span v-html="msg"></span>
<br/>
<!-- 原樣顯示 -->
<span v-text="msg"></span>
</div>
<script>
new Vue({
el:"#app",
data:{
msg:"<h1>Hello</h1>",
},
methods:{
hello(){
return "World"
}
}
})
</script>
</body>
</html>
插值運算式
- 花括號{{}}:只能寫在標簽體內,不能用在標簽內,
- 用v-bind解決 {{}},必須有回傳值
單向系結v-bind
- 給html標簽的屬性系結值,href、class、style、、
- 可以縮寫,:就用冒號
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script src="../node_modules/vue/dist/vue.js"></script>
<!-- 給html標簽的屬性系結 -->
<div id="app">
<a v-bind:href="link">gogogo</a>
<!-- class,style {class名:加上?}-->
<span v-bind:class="{active:isActive,'text-danger':hasError}"
:style="{color: color1,fontSize: size}">你好</span>
</div>
<script>
let vm = new Vue({
el:"#app",
data:{
link: "http://www.baidu.com",
isActive:true, // 表示是否將屬性添加到class屬性中
hasError:true,
color1:'red',
size:'36px'
}
})
</script>
</body>
</html>
雙向系結v-model
- 表單項,自定義組件,input、、、
- 雙向表示,頁面變內部屬性也變
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script src="../node_modules/vue/dist/vue.js"></script>
<!-- 表單項,自定義組件 -->
<div id="app">
精通的語言:<br>
<input type="checkbox" v-model="language" value="Java"> java<br/>
<input type="checkbox" v-model="language" value="PHP"> PHP<br/>
<input type="checkbox" v-model="language" value="Python"> Python<br/>
選中了 {{language.join(",")}}
<!-- join拼接里面的值用逗號隔開 -->
</div>
<script>
let vm = new Vue({
el:"#app",
data:{
language: []
}
})
</script>
</body>
</html>
v-on
- 系結事件,事件修飾符
- 簡寫為:@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script src="../node_modules/vue/dist/vue.js"></script>
<div id="app">
<!--事件中直接寫js片段-->
<button v-on:click="num++">點贊</button>
<!--事件指定一個回呼函式,必須是Vue實體中定義的函式-->
<button @click="cancel()">取消</button>
<!-- -->
<h1>有{{num}}個贊</h1>
<!-- 事件修飾符 -->
<!-- .once:只有第一次才生效 -->
<div style="border: 1px solid red;padding: 20px;" v-on:click.once="hello">
大div
<!-- .stop 阻止冒泡,不要傳到上一層的v-on -->
<div style="border: 1px solid blue;padding: 20px;" @click.stop="hello">
小div <br />
<!--.prevent:阻止默認行為,就是不讓他跳轉 -->
<!--.prevent.stop:阻止默認行為,并且阻止往上冒泡,就是只執行一次hello -->
<a href="http://www.baidu.com" @click.prevent.stop="hello">去百度</a>
</div>
</div>
<!-- 按鍵修飾符: -->
<!-- keyup.up:按鍵盤上鍵 -->
<!-- click.ctrl:ctrl+單擊 -->
<input type="text" v-model="num" v-on:keyup.up="num+=2" @keyup.down="num-=2" @click.ctrl="num=10"> <br />
提示:
</div>
<script>
new Vue({
el:"#app",
data:{
num: 1
},
methods:{
cancel(){
this.num--;
},
hello(){
alert("點擊了")
}
}
})
</script>
</body>
</html>
v-for
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<ul>
<!-- 遍歷陣列users-->
<li v-for="(user,indexA) in users" :key="user.name" v-if="user.gender == '女'">
<!-- 1、顯示user資訊:v-for="item in items" -->
當前索引:{{indexA}} ==> {{user.name}} ==> {{user.gender}} ==>{{user.age}} <br>
<!-- 2、獲取陣列下標:v-for="(item,index) in items" -->
<!-- 3、遍歷物件:
v-for="value in object"
v-for="(value,key) in object"
v-for="(value,key,index) in object"
-->
物件資訊:
<span v-for="(v,k,i) in user">{{k}}=={{v}}=={{i}};</span>
<!-- 4、遍歷的時候都加上:key來區分不同資料,提高vue渲染效率 -->
</li>
</ul>
<!-- 遍歷常規陣列nums,:key 我們用索引來區分-->
<ul>
<li v-for="(num,index) in nums" :key="index"></li>
</ul>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
let app = new Vue({
el: "#app",
data: {
users: [{ name: '柳巖', gender: '女', age: 21 },
{ name: '張三', gender: '男', age: 18 },
{ name: '范冰冰', gender: '女', age: 24 },
{ name: '劉亦菲', gender: '女', age: 18 },
{ name: '古力娜扎', gender: '女', age: 25 }],
nums: [1,2,3,4,4]
},
})
</script>
</body>
</html>
v-if和v-show
- v-if,顧名思義,條件判斷,當得到結果為true時,所在的元素才會被渲染,為false會洗掉標簽
- v-show,當得到結果為true時,所在的元素才會被顯示,為false只是隱藏了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!--
v-if,顧名思義,條件判斷,當得到結果為true時,所在的元素才會被渲染,
v-show,當得到結果為true時,所在的元素才會被顯示,
-->
<div id="app">
<button v-on:click="show = !show">點我呀</button>
<!-- 1、使用v-if顯示 -->
<h1 v-if="show">if=看到我....</h1>
<!-- 2、使用v-show顯示 -->
<h1 v-show="show">show=看到我</h1>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
let app = new Vue({
el: "#app",
data: {
show: true
}
})
</script>
</body>
</html>
v-else和v-else-if
- 和java的if,else if類似
- v-if優先級高于v-for
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<button v-on:click="random=Math.random()">點我呀</button>
<span>{{random}}</span>
<h1 v-if="random>=0.75">
看到我啦?! >= 0.75
</h1>
<h1 v-else-if="random>=0.5">
看到我啦?! >= 0.5
</h1>
<h1 v-else-if="random>=0.2">
看到我啦?! >= 0.2
</h1>
<h1 v-else>
看到我啦?! < 0.2
</h1>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
let app = new Vue({
el: "#app",
data: { random: 1 }
})
</script>
</body>
</html>
計算屬性和偵聽器
- computed:計算資料,比如購物車總共多少錢
- watch:監聽資料,比如庫存不夠了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<!-- 某些結果是基于之前資料實時計算出來的,我們可以利用計算屬性,來完成 -->
<ul>
<li>西游記; 價格:{{xyjPrice}},數量:<input type="number" v-model="xyjNum"> </li>
<li>水滸傳; 價格:{{shzPrice}},數量:<input type="number" v-model="shzNum"> </li>
<li>總價:{{totalPrice}}</li>
{{msg}}
</ul>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
// watch可以讓我們監控一個值的變化,從而做出相應的反應,
new Vue({
el: "#app",
data: {
xyjPrice: 99.98,
shzPrice: 98.00,
xyjNum: 1,
shzNum: 1,
msg: ""
},
computed: {
totalPrice(){
return this.xyjPrice*this.xyjNum + this.shzPrice*this.shzNum
}
},
watch: {
// 新值,舊值
xyjNum(newVal,oldVal){
if(newVal>=3){
this.msg = "庫存超出限制";
this.xyjNum = 3
}else{
this.msg = "";
}
}
},
})
</script>
</body>
</html>
過濾器
- filters過濾器常用來處理文本格式化的操作,過濾器可以用在兩個地方:雙花括號插值和 v-bind 運算式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!-- 過濾器常用來處理文本格式化的操作,過濾器可以用在兩個地方:雙花括號插值和 v-bind 運算式 -->
<div id="app">
<ul>
<li v-for="user in userList">
{{user.id}} ==> {{user.name}} ==> {{user.gender == 1?"男":"女"}} ==>
<!--user.gender | genderFilter 表示用genderFilter過濾一下-->
{{user.gender | genderFilter}} ==> {{user.gender | gFilter}}
</li>
</ul>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
// 全域過濾器
Vue.filter("gFilter", function (val) {
if (val == 1) {
return "男~~~";
} else {
return "女~~~";
}
})
let vm = new Vue({
el: "#app",
data: {
userList: [
{ id: 1, name: 'jacky', gender: 1 },
{ id: 2, name: 'peter', gender: 0 }
]
},
filters: {
// filters 定義區域過濾器,只可以在當前vue實體中使用
genderFilter(val) {
if (val == 1) {
return "男";
} else {
return "女";
}
}
}
})
</script>
</body>
</html>
組件化
- 在大型應用開發的時候,頁面可以劃分成很多部分,往往不同的頁面,也會有相 同的部分,
- 例如可能會有相同的頭部導航, 但是如果每個頁面都自開發,這無疑增加了我們開發的成本,所以我們會把頁面 的不同分拆分成立的組件,然后在不同頁面就可以共享這些組件,避免重復開發,
- 在vue里,所有的vue實體都是組件 組件其實也是一個vue實體,因此它在定義時也會接收:data、methods、生命周期函等 不同的是組件不會與頁面的元素綁定,否則就無法復用了,因此沒有el屬性,
- 但是組件渲染需要html模板,所以增加了template屬性,值就是HTML模板 全域組件定義完畢,任何vue實體都可以直接在HTML中通過組件名稱來使用組了 data必須是一個函式,不再是一個物件,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<button v-on:click="count++">我被點擊了 {{count}} 次</button>
<counter></counter>
<counter></counter>
<counter></counter>
<counter></counter>
<counter></counter>
<button-counter></button-counter>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
//1、全域宣告注冊一個組件
Vue.component("counter", {
template: `<button v-on:click="count++">我被點擊了 {{count}} 次</button>`,
data() {
return {
count: 1
}
}
});
//2、區域宣告一個組件
const buttonCounter = {
template: `<button v-on:click="count++">我被點擊了 {{count}} 次~~~</button>`,
data() {
return {
count: 1
}
}
};
new Vue({
el: "#app",
data: {
count: 1
},
components: {
'button-counter': buttonCounter
}
})
</script>
</body>
</html>
生命周期鉤子函式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<span id="num">{{num}}</span>
<button @click="num++">贊!</button>
<h2>{{name}},有{{num}}個人點贊</h2>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
let app = new Vue({
el: "#app",
data: {
name: "張三",
num: 100
},
methods: {
show() {
return this.name;
},
add() {
this.num++;
}
},
beforeCreate() {
console.log("=========beforeCreate=============");
console.log("資料模型未加載:" + this.name, this.num);
console.log("方法未加載:" + this.show());
console.log("html模板未加載:" + document.getElementById("num"));
},
created: function () {
console.log("=========created=============");
console.log("資料模型已加載:" + this.name, this.num);
console.log("方法已加載:" + this.show());
console.log("html模板已加載:" + document.getElementById("num"));
console.log("html模板未渲染:" + document.getElementById("num").innerText);
},
beforeMount() {
console.log("=========beforeMount=============");
console.log("html模板未渲染:" + document.getElementById("num").innerText);
},
mounted() {
console.log("=========mounted=============");
console.log("html模板已渲染:" + document.getElementById("num").innerText);
},
beforeUpdate() {
console.log("=========beforeUpdate=============");
console.log("資料模型已更新:" + this.num);
console.log("html模板未更新:" + document.getElementById("num").innerText);
},
updated() {
console.log("=========updated=============");
console.log("資料模型已更新:" + this.num);
console.log("html模板已更新:" + document.getElementById("num").innerText);
}
});
</script>
</body>
</html>
使用Vue腳手架進行開發
- 全域安裝webpack
- npm install webpack -g :全域安裝vue腳手架
- npm install -g @vue/cli-init
- 初始化vue專案:
vue init webpack appname:vue腳手架使用webpack模板初始化一個appname專案 - 啟動vue專案:專案的package.json中有scripts,代表我們能運行的命令 npm start = npm run dev: 啟動專案 npm run build:將專案打包
使用element-ui
-
官網:https://element.eleme.cn/#/zh-CN/component/installation
-
推薦使用 npm 的方式安裝,它能更好地和 webpack 打包工具配合使用,
-
npm i element-ui -S 在 main.js 中寫入以下內容:
-
import ElementUI from ‘element-ui’;
-
import ‘element-ui/lib/theme-chalk/index.css’;
-
Vue.use(ElementUI);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/382039.html
標籤:其他
