主頁 > 軟體設計 > 谷粒商城_03_前端基礎

谷粒商城_03_前端基礎

2021-12-16 08:56:22 軟體設計

文章目錄

  • 前端
    • 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">
            看到我啦?! &gt;= 0.75
        </h1>

        <h1 v-else-if="random>=0.5">
            看到我啦?! &gt;= 0.5
        </h1>

        <h1 v-else-if="random>=0.2">
            看到我啦?! &gt;= 0.2
        </h1>

        <h1 v-else>
            看到我啦?! &lt; 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

標籤:其他

上一篇:【深入理解JAVA虛擬機】讀書筆記——執行緒安全與鎖優化

下一篇:圣誕節來了,怎能還沒有圣誕樹呢 快來為心愛的她送上專屬的圣誕禮物叭~

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more