1. 程式人生 > 其它 >[Vue之style和class、陣列更新與檢測、條件渲染、事件修飾符]

[Vue之style和class、陣列更新與檢測、條件渲染、事件修飾符]

[Vue之style和class、陣列更新與檢測、條件渲染、事件修飾符]

style和class

資料的雙向繫結


語法

    :屬性名=js變數/js語法

    :class='js變數、字串、js陣列、js物件'

    :style='js變數、字串、js陣列、js物件'
        
    :自定義屬性='js變數、字串、js陣列、js物件'

示例


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue的雙向資料繫結</title>
    <script src="./js/vue.js"></script>
</head>
-------------類屬性-----------------------------------------------------------------
<style>
    .color_red{
        background: red;
    }
    .color_blue{
        background: blue;
    }
    .fonta{
        font-size: 80px;
    }
-------------類屬性-----------------------------------------------------------------
</style>
<body>

-----------測試內容-----------------------------------------------------------------
<div id="test">

    屬性前加冒號表示資料繫結,就可以寫js的變數或語法
    <div :class="class_obj">我是div</div>

    <hr>
    <div :style="style_obj">
        我是另一個div
    </div>
</div>
-----------測試內容-----------------------------------------------------------------

</body>

    
<script>
    var vm = new Vue({
        el: '#test',
        data: {
            // class_obj: 'div_cls_red', //字串
            // class_obj: ['div_cls_red'], //陣列 ---用的多
            class_obj: {div_cls_red: true}, //物件

            // style_obj: 'background: green'// 字串
            // style_obj: [{background:'red'},] //陣列,原來的css樣式的-  全都使用駝峰替換
            style_obj: {background:'yellow'} //原來的css樣式的-  全都使用駝峰替換  ---用的多
            //Vue.set(vm.style_obj,'fontSize','90px')
        },

    })
</script>
</html>



style_obj: 'background: blue'// 字串
style_obj: [{background: 'blue'},] //陣列,原來的css樣式的-  全都使用駝峰替換
style_obj: {background:'red'} //原來的css樣式的-  全都使用駝峰替換  ---用的多
Vue.set(vm.style_obj,'fontSize','80px')

:class='字串'


var vm = new Vue({
        el: '#test',
        data: {
            class_obj: 'color_red', //字串
        },
    })

:class='字串'的修改

:class='陣列'


var vm = new Vue({
        el: '#test',
        data: {
            class_obj:['color_red','fonta'], //陣列 ---用的多
        },
    })

:class='陣列'的修改

:class='陣列'補充


var vm = new Vue({
        el: '#test',
        data: {
            # 也可以用列表套字典寫法
            class_obj:[{color_red:true},{fonta:false}],   
        },
    })

:class='陣列'補充的修改方式

:class='物件'


var vm = new Vue({
        el: '#test',
        data: {
            class_obj: {color_blue: true,fonta:true}, //物件
        },
    })

:class='物件'的修改

陣列更新與檢測

可以檢測到變動的陣列操作


push:最後位置新增
pop:最後位置刪除
shift:第一個位置刪除
unshift:第一個位置新增
splice:切片
sort:排序
reverse:反轉

檢測不到變動的陣列操作


filter():過濾
concat():追加另一個數組
slice():
map():

示例


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>檢測與更新</title>
    <script src="./js/vue.js"></script>
</head>
<style>

    .color_red{
        background: red;
    }
    .color_blue{
        background: blue;
    }
    .fonta{
        font-size: 80px;
    }

</style>
<body>

<div id="test">
    <div :class="class_obj">這是第一個div</div>
</div>

</body>
<script>
    var vm = new Vue({
        el:'#test',
        data:{
            name:'劉鵬飛啊',
            class_obj: {color_blue: true,},
        },
    })
</script>

</html>

示例總結


從上面的圖可以看出,有些方法,是不會觸發 dom 的操作,比如 物件[key] = value 或者 物件.key = value

雖然屬性已經設定了,但是沒有觸發 dom 操作,這個時候就需要用 Vue 的其他方法。

# 一定會觸發dom的比較,如果有資料變了。頁面沒變,使用該方式賦值
Vue.set(vm.class_obj,'fonta',true) 		# 給 class_obj 的 fonta 屬性 賦值 true
Vue.delete(vm.class_obj,'color_blue')	# 刪除 class_obj 的 color_blue 屬性

更新和檢測原因


作者重寫了相關方法(只重寫了一部分方法,但是還有另一部分沒有重寫)

vue中使用的是虛擬DOM,會和原生的DOM進行比較,然後進行資料的更新,提高資料的重新整理速度(虛擬DOM用了diff演算法)

條件渲染

[Vue之style和class、陣列更新與檢測、條件渲染、事件修飾符]

style和class

資料的雙向繫結


語法

    :屬性名=js變數/js語法

    :class='js變數、字串、js陣列、js物件'

    :style='js變數、字串、js陣列、js物件'
        
    :自定義屬性='js變數、字串、js陣列、js物件'

示例


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue的雙向資料繫結</title>
    <script src="./js/vue.js"></script>
</head>
-------------類屬性-----------------------------------------------------------------
<style>
    .color_red{
        background: red;
    }
    .color_blue{
        background: blue;
    }
    .fonta{
        font-size: 80px;
    }
-------------類屬性-----------------------------------------------------------------
</style>
<body>

-----------測試內容-----------------------------------------------------------------
<div id="test">

    屬性前加冒號表示資料繫結,就可以寫js的變數或語法
    <div :class="class_obj">我是div</div>

    <hr>
    <div :style="style_obj">
        我是另一個div
    </div>
</div>
-----------測試內容-----------------------------------------------------------------

</body>

    
<script>
    var vm = new Vue({
        el: '#test',
        data: {
            // class_obj: 'div_cls_red', //字串
            // class_obj: ['div_cls_red'], //陣列 ---用的多
            class_obj: {div_cls_red: true}, //物件

            // style_obj: 'background: green'// 字串
            // style_obj: [{background:'red'},] //陣列,原來的css樣式的-  全都使用駝峰替換
            style_obj: {background:'yellow'} //原來的css樣式的-  全都使用駝峰替換  ---用的多
            //Vue.set(vm.style_obj,'fontSize','90px')
        },

    })
</script>
</html>



style_obj: 'background: blue'// 字串
style_obj: [{background: 'blue'},] //陣列,原來的css樣式的-  全都使用駝峰替換
style_obj: {background:'red'} //原來的css樣式的-  全都使用駝峰替換  ---用的多
Vue.set(vm.style_obj,'fontSize','80px')

:class='字串'


var vm = new Vue({
        el: '#test',
        data: {
            class_obj: 'color_red', //字串
        },
    })

:class='字串'的修改

:class='陣列'


var vm = new Vue({
        el: '#test',
        data: {
            class_obj:['color_red','fonta'], //陣列 ---用的多
        },
    })

:class='陣列'的修改

:class='陣列'補充


var vm = new Vue({
        el: '#test',
        data: {
            # 也可以用列表套字典寫法
            class_obj:[{color_red:true},{fonta:false}],   
        },
    })

:class='陣列'補充的修改方式

:class='物件'


var vm = new Vue({
        el: '#test',
        data: {
            class_obj: {color_blue: true,fonta:true}, //物件
        },
    })

:class='物件'的修改

陣列更新與檢測

可以檢測到變動的陣列操作


push:最後位置新增
pop:最後位置刪除
shift:第一個位置刪除
unshift:第一個位置新增
splice:切片
sort:排序
reverse:反轉

檢測不到變動的陣列操作


filter():過濾
concat():追加另一個數組
slice():
map():

示例


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>檢測與更新</title>
    <script src="./js/vue.js"></script>
</head>
<style>

    .color_red{
        background: red;
    }
    .color_blue{
        background: blue;
    }
    .fonta{
        font-size: 80px;
    }

</style>
<body>

<div id="test">
    <div :class="class_obj">這是第一個div</div>
</div>

</body>
<script>
    var vm = new Vue({
        el:'#test',
        data:{
            name:'劉鵬飛啊',
            class_obj: {color_blue: true,},
        },
    })
</script>

</html>

示例總結


從上面的圖可以看出,有些方法,是不會觸發 dom 的操作,比如 物件[key] = value 或者 物件.key = value

雖然屬性已經設定了,但是沒有觸發 dom 操作,這個時候就需要用 Vue 的其他方法。

# 一定會觸發dom的比較,如果有資料變了。頁面沒變,使用該方式賦值
Vue.set(vm.class_obj,'fonta',true) 		# 給 class_obj 的 fonta 屬性 賦值 true
Vue.delete(vm.class_obj,'color_blue')	# 刪除 class_obj 的 color_blue 屬性

更新和檢測原因


作者重寫了相關方法(只重寫了一部分方法,但是還有另一部分沒有重寫)

vue中使用的是虛擬DOM,會和原生的DOM進行比較,然後進行資料的更新,提高資料的重新整理速度(虛擬DOM用了diff演算法)

條件渲染

[Vue之style和class、陣列更新與檢測、條件渲染、事件修飾符]

style和class

資料的雙向繫結


語法

    :屬性名=js變數/js語法

    :class='js變數、字串、js陣列、js物件'

    :style='js變數、字串、js陣列、js物件'
        
    :自定義屬性='js變數、字串、js陣列、js物件'

示例


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue的雙向資料繫結</title>
    <script src="./js/vue.js"></script>
</head>
-------------類屬性-----------------------------------------------------------------
<style>
    .color_red{
        background: red;
    }
    .color_blue{
        background: blue;
    }
    .fonta{
        font-size: 80px;
    }
-------------類屬性-----------------------------------------------------------------
</style>
<body>

-----------測試內容-----------------------------------------------------------------
<div id="test">

    屬性前加冒號表示資料繫結,就可以寫js的變數或語法
    <div :class="class_obj">我是div</div>

    <hr>
    <div :style="style_obj">
        我是另一個div
    </div>
</div>
-----------測試內容-----------------------------------------------------------------

</body>

    
<script>
    var vm = new Vue({
        el: '#test',
        data: {
            // class_obj: 'div_cls_red', //字串
            // class_obj: ['div_cls_red'], //陣列 ---用的多
            class_obj: {div_cls_red: true}, //物件

            // style_obj: 'background: green'// 字串
            // style_obj: [{background:'red'},] //陣列,原來的css樣式的-  全都使用駝峰替換
            style_obj: {background:'yellow'} //原來的css樣式的-  全都使用駝峰替換  ---用的多
            //Vue.set(vm.style_obj,'fontSize','90px')
        },

    })
</script>
</html>



style_obj: 'background: blue'// 字串
style_obj: [{background: 'blue'},] //陣列,原來的css樣式的-  全都使用駝峰替換
style_obj: {background:'red'} //原來的css樣式的-  全都使用駝峰替換  ---用的多
Vue.set(vm.style_obj,'fontSize','80px')

:class='字串'


var vm = new Vue({
        el: '#test',
        data: {
            class_obj: 'color_red', //字串
        },
    })

:class='字串'的修改

:class='陣列'


var vm = new Vue({
        el: '#test',
        data: {
            class_obj:['color_red','fonta'], //陣列 ---用的多
        },
    })

:class='陣列'的修改

:class='陣列'補充


var vm = new Vue({
        el: '#test',
        data: {
            # 也可以用列表套字典寫法
            class_obj:[{color_red:true},{fonta:false}],   
        },
    })

:class='陣列'補充的修改方式

:class='物件'


var vm = new Vue({
        el: '#test',
        data: {
            class_obj: {color_blue: true,fonta:true}, //物件
        },
    })

:class='物件'的修改

陣列更新與檢測

可以檢測到變動的陣列操作


push:最後位置新增
pop:最後位置刪除
shift:第一個位置刪除
unshift:第一個位置新增
splice:切片
sort:排序
reverse:反轉

檢測不到變動的陣列操作


filter():過濾
concat():追加另一個數組
slice():
map():

示例


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>檢測與更新</title>
    <script src="./js/vue.js"></script>
</head>
<style>

    .color_red{
        background: red;
    }
    .color_blue{
        background: blue;
    }
    .fonta{
        font-size: 80px;
    }

</style>
<body>

<div id="test">
    <div :class="class_obj">這是第一個div</div>
</div>

</body>
<script>
    var vm = new Vue({
        el:'#test',
        data:{
            name:'劉鵬飛啊',
            class_obj: {color_blue: true,},
        },
    })
</script>

</html>

示例總結


從上面的圖可以看出,有些方法,是不會觸發 dom 的操作,比如 物件[key] = value 或者 物件.key = value

雖然屬性已經設定了,但是沒有觸發 dom 操作,這個時候就需要用 Vue 的其他方法。

# 一定會觸發dom的比較,如果有資料變了。頁面沒變,使用該方式賦值
Vue.set(vm.class_obj,'fonta',true) 		# 給 class_obj 的 fonta 屬性 賦值 true
Vue.delete(vm.class_obj,'color_blue')	# 刪除 class_obj 的 color_blue 屬性

更新和檢測原因


作者重寫了相關方法(只重寫了一部分方法,但是還有另一部分沒有重寫)

vue中使用的是虛擬DOM,會和原生的DOM進行比較,然後進行資料的更新,提高資料的重新整理速度(虛擬DOM用了diff演算法)

條件渲染

指令 釋義
v-if 相當於: if
v-else 相當於:else
v-else-if 相當於:else if

示例


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>if的使用</title>
    <script src="./js/vue.js"></script>
</head>
<style>

</style>
<body>

<div id="app">

    <p v-if="type==0">第 1 行</p>
    <p v-else-if="type==1">第 2 行</p>
    <p v-else-if="type==2">第 3 行</p>
    <p v-else>第 4 行</p>

</div>

</body>
<script>
        var vm = new Vue({
            el:'#test',
            data:{
                type:1
            },
        })
</script>

</html>

在上面的基礎進行一次變形


<div id="test">

    <button @click="addone">這是一個按鈕</button>
    
    <p v-if="typea==1">第 1 行</p>
    <p v-else-if="typea==2">第 2 行</p>
    <p v-else-if="typea==3">第 3 行</p>
    <p v-else>第 4 行</p>
    
</div>

<script>
    var vm = new Vue({
        el:'#test',
        data:{
            typea:1
        },
        methods:{
            addone(){
                console.log(this.typea)
                this.typea=this.typea+1
            }
        }
    })
</script>

v-if+v-for控制購物車顯示與否


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>購物車的顯示與否</title>
    <script src="./js/vue.js"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">

</head>
<style>

</style>
<body>


<div id="test" >
    
<button @click="showtime">這是一個按鈕</button>

    <table class="table">
        <tr>
            <td>名字</td>
            <td>價錢</td>
        </tr>
        <tr v-if="shopping.length==0">
            <td>沒有資料啊</td>
            <td>沒有資料啊</td>

        </tr>
        <tr v-else v-for="shop,index in shopping">
            <td>{{shop.name}}</td>
            <td>{{shop.price}}</td>
        </tr>

    </table>

</div>


</body>
<script>
        var vm = new Vue({
            el:'#test',
            data:{
              shopping: [],
            },
            methods:{
                showtime(){
                    this.shopping=[
                    {'name': '番茄', 'price': 20},
                    {'name': '土豆', 'price': 30},
                    {'name': '西紅柿', 'price': 20},
                    {'name': '番茄炒西紅柿', 'price': 40},
                    ]
                }
            }
        })
</script>

</html>

v-for遍歷補充 key


1、vue中涉及到迴圈,通常能看到,:key="item"
    
    <p v-for="item in 4" :key="item">
          <h3>{{ item }}</h3>
    </p>
    
2、vue中使用的是虛擬DOM,會和原生的DOM進行比較,然後進行資料的更新,提高資料的重新整理速度

    在v-for迴圈陣列、物件時,建議在控制元件/元件/標籤寫1個key屬性,屬性值唯一

    頁面更新之後,會加速DOM的替換(渲染)

    :key="變數"

參考文件 : https://www.zhihu.com/question/61064119

過濾案例


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>過濾案例</title>
    <script src="./js/vue.js"></script>
</head>
<style>

</style>
<body>


<div id="test">

    <input type="text" v-model="serach" @input="showtime">
    <p v-for=" msg,index in newlist">第{{index+1}}個是{{msg}}</p>

</div>


</body>
<script>

    //陣列過濾的使用(1)
    // var ages = [32, 33, 16, 40,8,9,17,18];
    // var ages_new=ages.filter(function (item) {
    //     // console.log(item)
    //     return item >= 18
    // })
    // console.log(ages_new)

    // 使用箭頭函式(es6的語法,箭頭函式)
    // var ages = [32, 33, 16, 40, 8, 9, 17, 18];
    // var ages_new = ages.filter(item => {
    //     return item >= 18
    // })
    // console.log(ages_new)

    var vm = new Vue({
        el: '#test',
        data: {
            serach:'',
            baselist:['a','abc','bcd','bdgd','cfdag','cbfd','cwefd','fdoan','fu','fing','liui','linng','lpq','pzx','pmm',],
            newlist:[]
        },
        methods: {
            showtime() {
            this.newlist = this.baselist.filter(item => {
                var num = this.serach.length
                if(this.serach === 'all'){
                    return true
                }
                if( num === 0){
                    return false
                }
                return item.indexOf(this.serach)>-1
            })
            }

        }
    })
</script>

</html>

事件修飾符

事件修飾符 釋義
.stop 只處理自己的事件,父控制元件冒泡的事件不處理(阻止事件冒泡)
.self 只處理自己的事件,子控制元件冒泡的事件不處理
.prevent 阻止a連結的跳轉
.once 事件只會觸發一次(適用於抽獎頁面)

使用修飾符時,順序很重要;相應的程式碼會以同樣的順序產生

@事件.self @事件.stop


--------------冒泡事件-------------------------------------------------------------

<div id="app">

<div @click.self="one('第一個div')">第一個div
  <div @click="one('第一個div裡面的div')">第一個div裡面的div
    <div @click="one('第一個div裡面的div裡面的div')">第一個div裡面的div裡面的div</div>
    </div>
  </div>
</div>

</body>
<script>
    var vm = new Vue({
        el: '#test',
        data: {},
        methods:{
            one(msg){
                console.log(msg)
            }
        }
    })
</script>

div包裹div裡面再包裹一層div

如果都有點選事件,點選裡層的,會同時觸發外層的事件


--------------阻止冒泡------------------------------------------------------

<div @click.self="one('第一個div')">第一個div 
  <div @click="one('第一個div裡面的div')">第一個div裡面的div
	<div @click.stop="one('第一個div裡面的div裡面的div')">第一個div裡面的div裡面的div
  </div>
</div>

關於事件.self和事件.stop


.self 是對於子類行為不作為,也就是說子類中有點選事件,自己也有事件,子類如何都不會觸發自己的事件。

.stop 是對父類不作為行為,自己和父類都有點選事件,自己觸發之後結束,不會冒泡。

@事件.prevent


<div id="test">
	<a href="https://github.com/" @click="one(點選了一下a標籤)">點我即可</a>
</div>

<script>
    var vm = new Vue({
        el: '#test',
        data: {},
        methods:{
            one(msg){
                console.log(msg)
            }
        }
    })
</script>

先觸發了點選事件,然後跳轉

事件新增 prevent


<a href="https://github.com/" @click.prevent="one('點選了一下a標籤')">點我即可</a>

@事件.once


<div id="test">
	<p @click="one">點了 {{serach}} 次</p>
</div>

<script>
	var vm = new Vue({
 		el: '#test',
        data: {
            serach:1,
        },
        methods:{
            one(){
                this.serach+=1
            }
        }
    })                     
</script>

事件可以一直觸發,有時候為了避免這種情況可以用once


<p @click.once="one">點了 {{serach}} 次</p>