整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          前端框架VUE-數(shù)據(jù)綁定及模板語法

          、數(shù)據(jù)綁定

          Vue.js 的核心是一個(gè)允許采用簡潔的模板語法來聲明式地將數(shù)據(jù)渲染進(jìn) DOM 的系統(tǒng):

          <div id="app">
           {{ msg }}
          </div>
          
          //實(shí)例化代碼
          var app = new Vue({
           el: '#app',
           data: {
            msg:  '歡迎學(xué)習(xí)Vue'
           }
          })

          {{ msg }} 為什么會(huì)變成 msg 的值?vue 使用基本 html 的模板語法,允許開發(fā)者聲明式地將DOM 綁定至底層 vue 實(shí)例的數(shù)據(jù),所有 vue 模板都是合法的 html,所以能被遵循規(guī)范的瀏覽器和 html 解析器解析。

          二、模板語法

          2.1、mustache語法

          mustache 翻譯為中文,是胡子/胡須。由于 {{ msg }} 兩邊都有對(duì)稱的大括號(hào),就像人的胡須一樣,所以就叫做 mustache 語法。

          特點(diǎn):不僅可以直接寫成變量,也可以添加簡單的表達(dá)式。

          //寫法多樣,使用便捷
          <h2> {{ msg }} <h2>
          <h2> {{ fir+'  '+sed }} <h2>  
          <h2> {{ fir }}   {{sed}} <h2>  
          <h2> {{ number + 1 }} <h2>  
          <h2> {{ message.split('').reverse().join('')  }} <h2> 

          2.2、v-once

          上邊的數(shù)據(jù)綁定中,頁面展示 msg 的值,如果我們?cè)跒g覽器調(diào)試中,修改 msg 的值,頁面立馬會(huì)更新,始終保持最新的值為頁面內(nèi)容。

          調(diào)試模式,輸入如下內(nèi)容觀察:

          app.msg="你不愛我了" //回車

          vue 支持動(dòng)態(tài)渲染文本,在修改屬性的同時(shí),實(shí)時(shí)渲染文本。為了提高渲染效率,只需第一次渲染出文本之后,后期屬性再修改不會(huì)影響文本內(nèi)容。

          此時(shí)就需要使用 v-once 解決問題。

          //使用語法
          <span v-once>{{msg}}</span>

          特點(diǎn):該指令后面不需要任何表達(dá)式,表示元素或組件只渲染一次,不會(huì)隨數(shù)據(jù)的改變而改變文本。

          2.3、v-html

          在某些特殊情況下,頁面需要?jiǎng)討B(tài)地插入一段 html 代碼,比如編輯器,動(dòng)態(tài)傳入的就是一段html 代碼,使用時(shí)我們需要原樣輸出,如:

          <div>{{url}}</div>
          
          data(){
           return{
            url:'<a href="http://www.baidu.com">百度首頁</a>'
           }
          }

          直接這么寫并不能滿足我們的要求,我們需要展示成帶有超鏈接的百度首頁,此時(shí) v-html 登場。

          // v-html 使用語法
          <div v-html="url"></div>

          給元素添加 v-html 指令后,元素就展示成一個(gè)帶有超鏈接的百度首頁文字。

          v-html 特點(diǎn):可以解析字段內(nèi)的標(biāo)簽,把內(nèi)容當(dāng)作 html 標(biāo)簽來處理。

          2.4、v-text

          // 使用語法
          <span v-text="msg"></span>

          特點(diǎn):與 mustache 語法類似,用于展示文本的。使用沒有 mustache 靈活,所以使用較少。

          注意點(diǎn):<span v-text="msg">新內(nèi)容</text> 標(biāo)簽中又新增內(nèi)容時(shí),會(huì)把原來 msg 中的內(nèi)容覆蓋掉。

          2.5、v-pre

          v-pre 與 html 中的 pre 標(biāo)簽有些類似,html 中的 pre 會(huì)原樣輸入空格、換行、縮進(jìn)和文本內(nèi)容。v-pre 也是原樣輸出內(nèi)容,不會(huì)解析。

          // 使用語法
          <div v-pre> {{ msg }} </div>
          頁面直接輸出 {{ msg }}

          2.6、v-cloak

          cloak 翻譯成中文,是斗篷。那么 v-cloak是用來干什么的呢?

          html頁面運(yùn)行的時(shí)候,會(huì)閃現(xiàn) {{ msg }} ,如圖:

          v-locak 就是用來解決這個(gè)問題的。

          // 使用語法
          <div v-cloak> {{ msg }} </div>

          特點(diǎn):在 vue 解析之前,元素有 v-cloak 屬性,vue 解析之后,元素沒有 v-cloak 屬性。

          利用 v-cloak 的特點(diǎn),我們?cè)?css 中添加

          [v-cloak]{
           display:'none'
          }

          此時(shí)再運(yùn)行網(wǎng)頁的時(shí)候,解析之前會(huì)被隱藏掉,解析之后才展示內(nèi)容,就不會(huì)再閃現(xiàn) {{msg}}。

          話不多說,看圖!

          本篇文章介紹 Vue3 + vite +TS 項(xiàng)目內(nèi)使用 Echarts 5 繪制中國地圖,標(biāo)記分布點(diǎn)!之前沒有接觸過 Echarts 的,可以先去官方示例看看,里面圖形特別齊全。但是官方文檔看著費(fèi)勁的,太多了根本記不住,所以自己做個(gè)總結(jié),下次就可以直接使用了,不用做重復(fù)無用功。

          一、安裝

          Echarts 已更新到了 5.0 版本,安裝完記得檢查下自己的版本是否是 5.0 。

          npm install echarts --save

          安裝完成之后,在 package.json 中檢查是否安裝成功?

          二、下載地圖的 json 數(shù)據(jù)

          可以下載中國以及各個(gè)省份地圖數(shù)據(jù)。免費(fèi)的文件下載地址:

          http://datav.aliyun.com/portal/school/atlas/area_selector#&lat=30.332329214580188&lng=106.72278672066881&zoom=3.5

          記得收藏哦!免得浪費(fèi)加班時(shí)間。

          三、引入

          引入 echarts 可以全局引入:

          import * as echarts from "echarts"
          
          /* 之前vue2 */
          Vue.prototype.$ecahrt = echarts
          
          /* vue3 */
          app.config.globalProperties.$echarts = echarts

          也可以直接在繪制頁面內(nèi)按需引用。

          引入需要繪制的地圖數(shù)據(jù) json 或 js 文件,本文使用的是 json 格式:

          import chinaJSON from '../../assets/json/china.json'

          注意:引入的時(shí)候先引入 echarts ,后引入 chinaJSON 文件,順序不能反哦!

          四、開始繪制地圖

          template 部分代碼:

          <template>
           <div>
            <div
             ref="chinaMap"
             style="height: 700px;border: solid 1px red;width: 100%;background: #010111;"
              >
             地圖1
            </div>
           </div>
          </template>

          script 部分代碼:

          <script lang="ts" setup>
          import * as echarts from 'echarts'
          import chinaJSON from '../../assets/json/china.json'
          import { onMounted, ref } from 'vue'
          const chinaMap = ref()
          onMounted(() => {
           drawChina()
          })
          let regions = [
           {
            name: '新疆維吾爾自治區(qū)',
            itemStyle: {
             areaColor: '#374ba4',
             opacity: 1,
            },
           },
           {
            name: '四川省',
            itemStyle: {
             areaColor: '#fe9b45',
             opacity: 1,
            },
           },
           {
            name: '陜西省',
            itemStyle: {
             areaColor: '#fd691b',
             opacity: 1,
            },
           },
           {
            name: '黑龍江省',
            itemStyle: {
             areaColor: '#ffc556',
             opacity: 1,
            },
           },
          ]
          let scatter = [
           { name: '北京烤鴨', value: [116.46122, 39.97886, 9] },
           { name: '蘭州拉面', value: [103.86615, 36.040129, 9] },
           { name: '新疆烤肉', value: [87.613228, 43.810394, 9] },
           { name: '長沙臭豆腐', value: [112.915204, 28.207735, 9] },
           { name: '西安肉夾饃', value: [108.953445, 34.288842, 9] },
           { name: '云南', value: [102.710002, 25.045806, 9] },
          ]
          function drawChina() {
           var myChart = echarts.init(chinaMap.value)
           echarts.registerMap('china', chinaJSON) //注冊(cè)可用的地圖
           var option = {
            geo: {
             map: 'china',
             roam: true, //是否允許縮放,拖拽
             zoom: 1, //初始化大小
             //縮放大小限制
             scaleLimit: {
              min: 1, //最小
               max: 2, //最大
              },
              //設(shè)置中心點(diǎn)
              center: [115.97, 29.71],
              //省份地圖添加背景
              regions: regions,
              itemStyle: {
               areaColor: '#0b122e',
               color: 'red',
               borderColor: '#232652',
               borderWidth: 2,
             },
             //高亮狀態(tài)
             emphasis: {
               itemStyle: {
               areaColor: '#1af9e5',
                color: '#fff',
               },
              },
            },
            //配置屬性
            series: {
             type: 'effectScatter',
             coordinateSystem: 'geo',
             data: scatter, 
             showEffectOn: 'render',
              rippleEffect: {
               //漣漪特效相關(guān)配置
               brushType: 'stroke', //波紋的繪制方式,可選 'stroke' 和 'fill'
             	},
              hoverAnimation: true, //是否開啟鼠標(biāo) hover 的提示動(dòng)畫效果
              label: {
               //圖形上的文本標(biāo)簽,可用于說明圖形的一些數(shù)據(jù)信息,比如值,名稱等,
               normal: {
                formatter: '{b}',
                position: 'right',
                show: true,
               },
              },
              itemStyle: {
              //圖形樣式,normal 是圖形在默認(rèn)狀態(tài)下的樣式;emphasis 是圖形在高亮狀態(tài)下的樣式,比如在鼠標(biāo)懸浮或者圖例聯(lián)動(dòng)高亮?xí)r
               normal: {
                color: '#ffffff', //散點(diǎn)的顏色
                shadowBlur: 10,
                shadowColor: 20,
                fontSize: '12px',
               },
              },
              zlevel: 1,
             },
           }
           myChart.setOption(option)
          }
          </script>


          想看更多的可以去官方文檔:

          https://echarts.apache.org/zh/option.html#geo.regions.emphasis.itemStyle

          013年,在Google工作的尤雨溪,開發(fā)出了一款輕量Javascript框架,最初命名為Seed,同年12月,更名為Vue,一經(jīng)推出發(fā)展迅速,如今已成為最時(shí)髦和炙手可熱前端框架,在Github上獲得了超過十萬的Star,國內(nèi)許多知名公司都使用Vue作為前端開發(fā)工具,例如餓了么、美團(tuán)等,很多公司的招聘要求都會(huì)把會(huì)使用vue作為加分項(xiàng)。

          Vue的作者 - 尤雨溪

          001-Vue的定位是什么?

          Vue是一個(gè)JavaScript框架,類似的框架有React,Angular等等,所謂框架就是一個(gè)比較大型的庫,使用它能讓基于網(wǎng)頁的前端應(yīng)用程序開發(fā)起來更加方便。相對(duì)于完全采用原生JavaScript代碼來編寫前端代碼而言,使用框架的代碼量更少,開發(fā)效率也更高。

          需要注意的是,Vue并非UI框架,它的定位與Bootstrap、Frozen UI這一類專注于頁面呈現(xiàn)的框架不是一回事,或者說,UI框架關(guān)注點(diǎn)在HTML,而Vue這一類框架關(guān)注點(diǎn)是JavaScript。Vue可以跟很多UI框架搭配使用,比如說Bootstrap(vueBootstrap),和一些專門與Vue配合的例如餓了嗎團(tuán)隊(duì)開發(fā)的element-ui等等。




          002-實(shí)現(xiàn)第一個(gè)VueJS應(yīng)用.html

          1.下載Vue: https://unpkg.com/vue/dist/vue.js

          2.將vue.js拷貝到任意一個(gè)目錄(工作目錄)

          3.在同一個(gè)目錄下用編輯軟件(隨便什么都行,記事本都可以)新建一個(gè)文件,輸入以下代碼:

             <script src="vue.js"></script>
             <div id="app">
                 <p>{{title}}</p>
             </div>
             <script>
                 new Vue({
                     el:"#app",
                     data:{
                         title: "Hello World!"
                     }
                 });


          003-擴(kuò)展這個(gè)VueJS應(yīng)用.html

          • 代碼如下:
            <script src="vue.js"></script>
            <div id="app">
                <input type="text" v-on:input="changeTitle">
                <p>{{title}}</p>
            </div>
            <script>
                new Vue({
                    el: "#app",
                    data: {
                        title: "Hello World!"
                    },
                    methods: {
                        changeTitle:function (event) {
                            this.title = event.target.value;
                        }
                    }
                });
            </script>
          • 試試看,你輸入的每一個(gè)字符都會(huì)被克隆,很有意思的一個(gè)程序!

          009-VueJS的模板語法和實(shí)例.html

          • 在上面的例子中,通過創(chuàng)建這個(gè)新的Vue實(shí)例,注意,雖然沒有把它存入一個(gè)變量內(nèi),Vue實(shí)例還是被創(chuàng)建了。
          • 通過創(chuàng)建這個(gè)Vue實(shí)例,就跟我們的HTML代碼建立了一個(gè)聯(lián)系,Vue基于上面的HTML代碼,創(chuàng)建了一個(gè)模版,要特別注意的是,Vue在運(yùn)行的時(shí)候,并不直接使用我們寫的HTML代碼。實(shí)際運(yùn)行的網(wǎng)頁里面也沒有我們寫的這些命令(最終頁面你并看不到大括號(hào)之類的東西)
          • Vue根據(jù)HTML代碼創(chuàng)建的模版存儲(chǔ)在內(nèi)部,然后用這個(gè)模版,創(chuàng)建真正渲染成DOM的HTML代碼,我們寫的HTML代碼并不是最后在瀏覽器里面運(yùn)行的那一份,中間有一層Vue實(shí)例把HTML代碼轉(zhuǎn)換成模版,然后渲染模版(比如花括號(hào)里面的{{title}}}等),最終再由它輸出渲染后的HTML代碼
          • Vue實(shí)例中存儲(chǔ)在data屬性內(nèi)的數(shù)據(jù),例如上面的title,可以直接在data屬性內(nèi)修改他們,也可以調(diào)用methods里的函數(shù)去生成內(nèi)容。例如:
            <script src="vue.js"></script>
            <div id="app">
                <!-- 注意此處并沒有調(diào)用Vue模板,而是調(diào)用了一個(gè)函數(shù) -->
                <p>{{sayHello()}}</p>
            </div>
            <script>
                new Vue({
                    el: "#app",
                    data: {
                        title: "Hello World!"
                    },
                    methods: {
                        //此處sayHello是一個(gè)方法(函數(shù)),但它返回的內(nèi)容被傳送到模版里去了
                        sayHello:function (event) {
                            return 'Hello!';
                        }
                    }
                });
            </script>

          010-訪問Vue實(shí)例里的數(shù)據(jù).html

          • 在vue實(shí)例中的任何地方,都可以用this來訪問所有的屬性和方法
            <script src="vue.js"></script>
            <div id="app">
                <p>{{sayHello()}}</p>
            </div>
            <script>
                new Vue({
                    el: "#app",
                    data: {
                        title: "Hello World!"
                    },
                    methods: {
                        sayHello:function (event) {
                        //注意此處,return的是Hello World!
                        //原生的JS是不允許這么調(diào)用的,Vue在中間層做了調(diào)劑
                            return this.title;
                        }
                    }
                });
            </script>

          011-屬性綁定.html

             <script src="vue.js"></script>
             <div id="app">
                 <!-- 注意:此處不能用<a href="{{link}}"> 這種形式來傳遞超鏈接值,只能用v-bind綁定并設(shè)置href的值 -->
                 <p>{{sayHello()}} - <a v-bind:href="link">Baidu</a> </p>
             </div>
             <script>
                 new Vue({
                     el: "#app",
                     data: {
                         title: "Hello World!",
                         link:"http://baidu.com"
                     },
                     methods: {
                         sayHello:function () {
                             return this.title;
                         }
                     }
                 });
             </script>
          

          012-理解和使用指令

          • 指令就是你放在代碼中的一些指示
          • 例如上面v-bind,它將一些東西和我們的數(shù)據(jù)(href值)綁定,一般來說如果需要在HTML內(nèi)直接顯示內(nèi)容的時(shí)候,我們采用花括號(hào)來解決,但在花括號(hào)不適用的時(shí)候,就要使用指令。
          • 格式: 指令 + 冒號(hào) + 參數(shù),如 v-bind:href = "link" link 就是你想要的從Vue實(shí)例中綁定的內(nèi)容,可以是屬性或者函數(shù) 一般來說你不能給HTML屬性傳遞動(dòng)態(tài)數(shù)據(jù),有了這些Vue指令,就可以了

          013-用v-once禁止二次渲染.html

          • 輸入以下代碼:
          <script src="vue.js"></script>
          <div id="app">
            <!-- 注意此處的v-once -->
            <h1 v-once>{{title}}</h1>
            <p>{{sayHello()}}</p>
          </div>
          <script>
            new Vue({
                el: "#app",
                data: {
                    title: "Hello World!",
                },
                methods: {
                    sayHello:function () {
                        this.title = 'Hello';
                        return this.title;
                    }
                }
            });
          </script>
          • 運(yùn)行以上代碼,我們?cè)馐窍胍粋€(gè)Hello World!和Hello的,但兩個(gè)元素都被渲染成Hello了,怎么辦?答案是:使用v-once, 即在第一個(gè)元素h1那里加上一個(gè)v-once,則表示該元素只會(huì)被渲染一次,之后不能再改變。

          014-如何輸出基礎(chǔ)的HTML.html

          • 輸入以下代碼:
          <script src="vue.js"></script>
          <div id="app">
            <!-- 注意此處的v-once -->
            <h1 v-once>{{title}}</h1>
            <p>{{sayHello()}}</p>
            <!-- 注意:v-html指令讓finishedLink以渲染后的HTML格式輸出,而不是純文本
            如果以花括號(hào){{finishedLink}} 來表示的話,將會(huì)是一個(gè)HTML形式的純文本。
            -->
            <p v-html = "finishedLink" ></p>
          </div>
          <script>
            new Vue({
                el: "#app",
                data: {
                    title: "Hello World!",
                    finishedLink:'<a href="http://baidu.com">Baidu.com</a>',
                },
                methods: {
          
                    sayHello:function () {
                        this.title = 'Hello';
                        return this.title;
                    }
                }
            });
          </script>
          • 以上這段代碼并不會(huì)輸出一個(gè)Baidu.com的超鏈接,而是連同HTML代碼一起全部輸出了。這樣的好處是,HTML元素不會(huì)被解析和渲染,而是被輸出為純文本,避免了跨站攻擊。
          • 但是,如果某些情況下你確實(shí)想輸出渲染后的HTML代碼,比如此處你確實(shí)希望看到一個(gè)百度的超鏈接,你就應(yīng)該使用v-html指令。在需要的元素內(nèi)嵌入v-html即可。請(qǐng)謹(jǐn)慎使用這個(gè)指令,它會(huì)把你暴露給XSS攻擊,比如此處的內(nèi)容可能是由用戶提交的,你是不能控制用戶上傳什么內(nèi)容的,若確定內(nèi)容安全,或者是由你自己合成的代碼,那就可以放心使用v-html

          015 作業(yè): 輸出數(shù)據(jù)到模板

          • 輸出你的姓名和年齡,兩者都作為屬性保存在data內(nèi),在P標(biāo)簽里面輸出
          <script src="vue.js"></script>
          <div id="app">
            <p>I am {{name}}</h1>
            <p>I am {{age}} years old.</p>
          </div>
          <script>
            new Vue({
                el: "#app",
                data: {
                    name: "Rockage",
                    age: "40",
                }
            });
          </script>
          • 在插值語法中,即在大括號(hào)中, 使用JavaScript表達(dá)式,輸出的年齡乘以3 <script src="vue.js">
          <script src="vue.js"></script>
          <div id="app">
            <p>I am {{name}}</p>
            <p>I am {{age * 3}} years old.</p>
          </div>
          <script>
            new Vue({
                el: "#app",
                data: {
                    name: "Rockage",
                    age: "40",
                }
            });
          </script>
          • 調(diào)用函數(shù),輸出這個(gè)函數(shù)的返回值,函數(shù)返回一個(gè)0到1之間的隨機(jī)數(shù)
          <script src="vue.js"></script>
          <div id="app">
            <p>The Random Number is : {{sayRnd()}}</p>
          </div>
          <script>
            new Vue({
                el: "#app",
                methods: {
                    sayRnd: function () {
                        // random_number = Math.random(); // 產(chǎn)生一個(gè)0到1的隨機(jī)數(shù)
                        // random_number = random_number.toFixed(2) //保留兩位小數(shù)
                        // 產(chǎn)生一個(gè)1到100的隨機(jī)數(shù)
                        random_number = Math.floor(Math.random() * (100 - 1 + 1)) + 1
                        return random_number;
                    }
                }
            });
          </script>
          • 使用baidu, 讓一個(gè)img標(biāo)簽顯示搜索到的圖片
          • 和超鏈接的href屬性一樣,也不允許直接將URL強(qiáng)填進(jìn)img的src里面,應(yīng)該把URL存在data里面,綁定到img標(biāo)簽的src屬性
          <script src="vue.js" xmlns:v-bind="http://www.w3.org/1999/xhtml"></script>
          <div id="app">
            <img  v-bind:src = "url">
          </div>
          <script>
            new Vue({
                el: "#app",
                data: {
                    url: "http://img.mp.itc.cn/upload/20170217/1f650c2645c541ad8cc70842d7d0bbe5_th.jpeg"
                }
            });
          </script>
          • 用名字預(yù)先填充一個(gè)TextBox,讓它默認(rèn)顯示你的名字
          <script src="vue.js" xmlns:v-bind="http://www.w3.org/1999/xhtml"></script>
          <div id="app">
            Name <input type = "text" v-bind:value = "default_name" />
          </div>
          <script>
            new Vue({
                el: "#app",
                data: {
                    default_name: "Hua Yang"
                }
            });
          </script>

          017-監(jiān)聽事件.html

          • 通過指令v-on監(jiān)聽來自模版的事件
          • v-on 可以監(jiān)聽任何由這個(gè)按鈕產(chǎn)生的DOM事件
          • 格式: v-on:事件名稱 = "事件函數(shù)名",如v-on:click = "increase"
          <script src="vue.js"></script>
          <div id="app">
            <button v-on:click="increase">Click Me</button>
            <p>{{ counter}}</p>
          </div>
          <script>
            new Vue({
                el: "#app",
                data: {
                    counter: 0,
                    x: 0,
                    y: 0
                },
                methods: {
                    increase: function () {
                        this.counter++;
                    }
                },
          
            });
          </script>

          018-從事件對(duì)象里獲取事件數(shù)據(jù).html

          • 用v-on來獲取事件數(shù)據(jù)
          • 這個(gè)例子很好地說明了如何通過Vue傳遞事件對(duì)象
          <script src="vue.js"></script>
          <div id="app">
          <p v-on:mousemove="updateCoordinates">Coordonates : {{x}}/{{y}}</p>
          </div>
          <script>
          new Vue({
              el: "#app",
              data: {
                  counter: 0,
                  x: 0,
                  y: 0
              },
              methods: {
                  updateCoordinates: function (event) {
                      this.x = event.clientX;
                      this.y = event.clientY;
                  }
              },
          
          });
          </script>

          019-傳遞你自己的事件參數(shù).html

          • 給組件傳遞自定義參數(shù),方法很簡單,在調(diào)用函數(shù)或者說設(shè)置引用時(shí)傳入?yún)?shù)即可。
          • 加入不僅要傳遞自定義參數(shù),還要傳遞DOM生成的事件對(duì)象給方法,也很簡單,只需要再加一個(gè)參數(shù),但這個(gè)參數(shù)的命名需為$event,vue會(huì)自動(dòng)捕捉這個(gè)默認(rèn)的事件參數(shù),并復(fù)制給一個(gè)可以在函數(shù)中使用的變量。
          • 本例中不對(duì)$event做詳解,下面的例子會(huì)提到它
          <script src="vue.js"></script>
          <div id="app">
            <!--
            請(qǐng)注意, 調(diào)用increase時(shí)增加了兩個(gè)參數(shù)
            -->
            <button v-on:click="increase(2,$event)">Click Me</button>
            <p>{{ counter}}</p>
          </div>
          <script>
            new Vue({
                el: "#app",
                data: {
                    counter: 0,
                    x: 0,
                    y: 0
                },
                methods: {
                    // increase 函數(shù)用step和event接收參數(shù)
                    increase: function (step,event) {
                        this.counter += step;
                    }
                },
            });
          </script>

          020-用事件修飾符來修改事件.html

          • 現(xiàn)在我們用第11課(鼠標(biāo)懸浮顯示XY坐標(biāo))那個(gè)為例
          • 我想設(shè)置一個(gè)區(qū)域,姑且稱為DEAD SPOT, 鼠標(biāo)進(jìn)入這個(gè)區(qū)域XY停止更新。
          • 常規(guī)方法是讓這個(gè)SPAN也綁定一個(gè)mousemove事件,然后調(diào)用一個(gè)事件函數(shù),事件函數(shù)不做任何處理。

          HTML部分:

          <span v-on:mousemove = "dummy">DEAD SPOT</span>


          JS部分:

          dummy: function(){
            event.stopPropagation();
          } 

          以上代碼確保事件不會(huì)傳播給綁定有這個(gè)屬性的SPAN上,當(dāng)然,我們還有更簡單的方法,就是使用事件修飾符,使用stop修飾符即可實(shí)現(xiàn)這個(gè)目的:

          <script src="vue.js"></script>
          <div id="app">
              <p v-on:mousemove="updateCoordinates">Coordonates : {{x}}/{{y}}
                  <!-- 請(qǐng)注意下面這個(gè)SPAN綁定的事件mousemove
                  采用了.stop修飾符,表示此元素的mousemove事件不做任何處理
                  -->
                  - <span v-on:mousemove.stop = "">DEAD SPOT</span>
              </p>
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      counter: 0,
                      x: 0,
                      y: 0
                  },
                  methods: {
                      updateCoordinates: function (event) {
                          this.x = event.clientX;
                          this.y = event.clientY;
                      }
                  },
              });
          </script>
          

          021-監(jiān)聽鍵盤事件.html

          • 這個(gè)例子很簡單,在輸入框中監(jiān)控鍵盤事件
          • 一旦敲入回車鍵,則彈出Alert窗口。
          <script src="vue.js"></script>
          <div id="app">
              <input type = "text" v-on:keyup.enter="alertMe" />
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      counter: 0,
                      x: 0,
                      y: 0
                  },
                  methods: {
                      alertMe: function () {
                          alert("Alert!");
                      }
                  },
              });
          </script>
          

          022-作業(yè):事件

          • 作業(yè)2-1:按下按鈕,彈出警告框。
          <script src="vue.js"></script>
          <div id="app">
            <button v-on:click="alertMe">Show Alert</button>
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      counter: 0,
                      x: 0,
                      y: 0
                  },
                  methods: {
                      alertMe: function () {
                          alert("You Clicked me!");
                      }
                  },
              });
          </script>
          
          • 作業(yè)2-2:記錄鍵盤輸入的值,存到data里并立即顯示。
          • 特點(diǎn)1: 除了直接綁定到一個(gè)方法,也可以在內(nèi)聯(lián) JavaScript 語句中調(diào)用方法,即不再綁定一個(gè)函數(shù),直接在調(diào)用的時(shí)候執(zhí)行JS語句,這種方法適用于函數(shù)體很短,只有一行的函數(shù)。
          • 特點(diǎn)2:采用了Vue的關(guān)鍵字$event,它表示JavaScript自動(dòng)生成的默認(rèn)事件對(duì)象,它保存了許多重要信息,如事件的目標(biāo)元素等。而這里,目標(biāo)元素就是輸入框,輸入框有一個(gè)value屬性,它就是用戶輸入值的來源,可以借由這個(gè)事件對(duì)象($event)來訪問它的目標(biāo)元素(target),再訪問它的屬性(value),并賦值給變量myValue.
          • 如果不采用內(nèi)聯(lián)的方式,也可以在此綁定一個(gè)事件函數(shù),然后將$event作為參數(shù)傳遞進(jìn)去,以同樣的方法在事件函數(shù)中訪問value并賦值給myValue,效果一樣。
          <script src="vue.js"></script>
          <div id="app">
              <input v-on:keydown = "myValue = $event.target.value" type="text"/>
              <p>{{myValue}}</p>
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      myValue: ''
                  }
              });
          </script>
          
          • 作業(yè)2-3:記錄鍵盤輸入的值,存到data里,但只有按下enter才更新顯示。
          • 這題很簡單,在上題的基礎(chǔ)上增加一個(gè).enter就可以了
          <script src="vue.js"></script>
          <div id="app">
              <input v-on:keydown.enter = "myValue = $event.target.value" type="text"/>
              <p>{{myValue}}</p>
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      myValue: ''
                  }
              });
          </script>
          

          024-在模板中編寫JS代碼.html

          • 在所有能訪問Vue實(shí)例的地方,無論是監(jiān)聽鼠標(biāo)點(diǎn)擊事件還是輸出counter,只要訪問了Vue實(shí)例, 就可以使用任何合法的JavaScript代碼,只要它是一個(gè)簡單表達(dá)式即可,當(dāng)然這個(gè)表達(dá)式中不能有if或者for循環(huán)等復(fù)雜語句。這就是所謂的“內(nèi)聯(lián)”調(diào)用法
          • 例如上面那個(gè)鼠標(biāo)點(diǎn)擊按鈕增加數(shù)字的例子,因?yàn)檫壿嬜銐蚝唵危覀兩踔猎趘-onclick里都不需要綁定任何函數(shù),而是可以直接讓它執(zhí)行一條語句,也就是說在調(diào)用的時(shí)候就直接寫成counter++即可。當(dāng)然,如果程序邏輯比較復(fù)雜,不足以用一條語句表達(dá),那么還是老老實(shí)實(shí)編寫一個(gè)函數(shù)并綁定到事件里為好。
          • 在模板中也可以直接插入表達(dá)式,例如像{{counter * 2}}這樣的表達(dá)式。
          • 當(dāng)然,我們還以用簡短的“三元表達(dá)式”,這種表達(dá)式是if語句的一個(gè)變種,能夠在一行內(nèi)完成對(duì)變量的判斷。
          <script src="vue.js"></script>
          <div id="app">
              <!-- 此處取消了事件函數(shù),直接用counter++代替 -->
              <button v-on:click="counter++">Click Me</button>
              <!-- 此處直接修改模板counter的值 -->
              <p>{{ counter * 2}}</p>
              <!-- 此處是一個(gè)三元表達(dá)式,用以判斷counter的值 -->
              <p>{{ counter * 2 > 10 ? 'Greate than 10' : 'Smaller than 10'}}</p>
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      counter: 0
                  }
              });
          </script>
          

          025-使用雙向綁定.html

          • 某些情況下,我們需要一邊同時(shí)監(jiān)聽事件,一邊實(shí)施更新數(shù)據(jù)的時(shí)候就要用到雙向綁定。
          • Vue的雙向綁定真的非常簡單,只需要在監(jiān)聽的的元素上加一個(gè)v-model即可
          • 其實(shí)用v-bind + v-on加上事件函數(shù),也能夠?qū)崿F(xiàn)這個(gè)功能,但是顯然v-model要簡單、清晰許多。
          <script src="vue.js"></script>
          <div id="app">
              <input type = "text" v-model = "name">
              <p>{{name}}</p>
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      name: ''
                  }
              });
          </script>
          

          026-用計(jì)算屬性來響應(yīng)改變.html

          • 目前為止,我們已經(jīng)學(xué)會(huì)了兩種Vue的屬性:data, methods,一個(gè)放置數(shù)據(jù),一個(gè)放置函數(shù),現(xiàn)在引入第三個(gè)屬性:computed
          • 先大致梳理一下本例子的效果:
          • 界面有3個(gè)按鈕,兩個(gè)計(jì)數(shù)器,第一個(gè)按鈕是計(jì)數(shù)器1增加,第二個(gè)按鈕是計(jì)數(shù)器1減少,第三個(gè)按鈕是計(jì)數(shù)器2增加
          • 另有1行文本,當(dāng)counter1大于5時(shí)候顯示:Greater than 5, 當(dāng)counter1小于5時(shí)顯示:Smaller than 5
          • 注意:counter2并沒有做這樣的判斷
          • 為了實(shí)時(shí)監(jiān)控counter1的值,這里運(yùn)用了兩種同步方法,第一種是在methods里寫一個(gè)事件函數(shù)result
          • 另一個(gè)辦法是運(yùn)用computed,寫一個(gè)事件函數(shù)output
          • 乍看上去,兩者代碼是相同的,并沒有什么區(qū)別,但實(shí)際區(qū)別是:
          • 1、在調(diào)用方法上,寫在methods的函數(shù)是帶括號(hào)調(diào)用的,即: result() 這樣的形式來調(diào)用
          • 2、寫在computed的函數(shù)并不需要像調(diào)用函數(shù)那樣調(diào)用,省略了括號(hào),直接像調(diào)用data一樣:output
          • 事實(shí)上,對(duì)于最終的結(jié)果,兩種方式確實(shí)是相同的,那么問題來了,有了methods不就可以了嗎?我們?yōu)槭裁催€多此一舉冒出一個(gè)computed呢?
          • 答案揭曉:
          • 1、在Vue內(nèi)部,computed屬性是基于他們的依賴的數(shù)據(jù)進(jìn)行緩存的,只有在它相關(guān)的依賴發(fā)生改變時(shí)才會(huì)重新求值,與之不相關(guān)的數(shù)據(jù)變化的時(shí)候它不會(huì)做出任何動(dòng)作。
          • 2、method則不同,只要頁面有所變化(重新渲染),它總會(huì)被執(zhí)行,無論數(shù)據(jù)是否與之相關(guān)。
          • 為了驗(yàn)證以上結(jié)論,我們?cè)诮缑嫔显俜乓粋€(gè)按鈕,再增加一個(gè)變量counter2,注意,這個(gè)按鈕和變量和counter1八竿子打不著關(guān)系,完全是一個(gè)獨(dú)立的東西。
          • 按下F12鍵,進(jìn)入瀏覽器調(diào)試模式,觀察console控制臺(tái)輸出
          • 現(xiàn)在按下Increase Counter 1或Decrease Counter 1
          • counter1的值開始發(fā)生了變化,并且控制臺(tái)出現(xiàn):Here is Computed 和 Here is Methods 兩行字
          • 這是因?yàn)楦淖僣ounter1值的時(shí)候,同時(shí)觸發(fā)了基于methods的result函數(shù),和基于computed的output函數(shù)
          • 以上邏輯容易理解,說得通!
          • 現(xiàn)在,按下Increase Counter 2按鈕,這時(shí)候counter2的值開始增大了,但是詭異的是,控制臺(tái)顯示:Here is Methods
          • 這是為什么呢?明明result函數(shù)里沒有任何一處是跟counter2有關(guān)系的,那為什么每次改變counter2的時(shí)候程序會(huì)跳進(jìn)result函數(shù)里呢?
          • 這正好印證了我們上面說過的一個(gè)結(jié)論:“只要頁面有所變化(重新渲染),它總會(huì)被執(zhí)行,無論數(shù)據(jù)是否與之相關(guān)”
          • 刷新的雖然是counter2,但是請(qǐng)注意:只要頁面被重新渲染,它總是會(huì)被執(zhí)行。
          • 不言而喻,如果是很復(fù)雜的頁面,反復(fù)去執(zhí)行一個(gè)與之無關(guān)的函數(shù),效率開銷肯定是很大的。
          • 所以我們需要computed屬性,這個(gè)屬性只處理與之相關(guān)的變量(例如本例中的counter1),而與之無關(guān)的變量(counter2)即使發(fā)生變化,即使頁面被重新渲染了,它也不會(huì)被執(zhí)行。
          • 大部分時(shí)候我們選擇computed就對(duì)了,但是有時(shí)候我們就是希望某些數(shù)據(jù)不要經(jīng)過緩存,就是想讓它直截了不停刷新并顯示的時(shí)候,選擇methods
          <script src="vue.js"></script>
          <div id="app">
              <button v-on:click="counter1++">Increase Counter 1</button>
              <button v-on:click="counter1--">Decrease Counter 1</button>
              <button v-on:click="counter2++">Increase Counter 2</button>
              <p>Counter:{{counter1}} | {{counter2}}</p>
              <!-- 注意兩種調(diào)用方法是不同的 -->
              <p>Counter 1 Result: {{result()}} | {{output}}</p>
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      counter1: 0,
                      counter2: 0
                  },
                  computed: {
                      output: function () {
                          console.log('Here is Computed')
                          return this.counter1 > 5 ? "Greater than 5" : "Smaller than 5"
                      }
                  },
                  methods: {
                      result: function () {
                          console.log('Here is Methods')
                          return this.counter1 > 5 ? "Greater than 5" : "Smaller than 5"
                      }
                  }
              });
          </script>
          

          027-計(jì)算屬性的替代:觀察改變.html

          • 現(xiàn)在再加入一個(gè)新的屬性:watch
          • watch是Vue提供了另外一種處理數(shù)據(jù)依賴的方法,其最終效果其實(shí)和上例的methods和computed差不太多,不同的地方在于:
          • 在computed屬性里面我們?cè)O(shè)置需要計(jì)算的屬性(如上例的output),然后在函數(shù)體里設(shè)置計(jì)算這個(gè)屬性(output)的邏輯。
          • watch則采用的是另外一種機(jī)制,把想要偵聽的屬性名稱設(shè)置為鍵, 而這個(gè)鍵必須是在data(或者computed)里面能夠找到的,例如上例的counter1或counter2,鍵名必須與data里面的屬性名稱相同。
          • 在watch中定義一個(gè)和屬性名相同的函數(shù),即當(dāng)屬性值發(fā)生變化時(shí)需要執(zhí)行的代碼,Vue會(huì)自動(dòng)把屬性變化之后的數(shù)值傳遞給該函數(shù)。
          • 從結(jié)果而言,既然說watch和computed的作用相當(dāng),那我們?yōu)樯斗且脀atch不可呢?因?yàn)閣atch是異步執(zhí)行的。
          • computed只能執(zhí)行同步任務(wù),也就是說在它return的時(shí)候,必須立即返回一個(gè)結(jié)果,中途不能執(zhí)行異步任務(wù)(例如定時(shí)器或者訪問服務(wù)器等等)。
          • 比如說,你需要一個(gè)值,在兩秒之后更新,就必須用 watch
          • 理論上,在Vue實(shí)例里,總是可以用this訪問其自身(請(qǐng)參見前面的內(nèi)容),但在回調(diào)閉包中卻不行,定時(shí)器函數(shù)(setTimer)是一個(gè)典型的回調(diào)閉包的例子,因此不能在其中直接訪問this,而是要用一個(gè)變量先保存起來,以便在setTimer函數(shù)中使用。
          • 當(dāng)然,你也可以嘗試一下把這段代碼中的 watch 改成 computed 去試試看,結(jié)果就是只會(huì)清0一次,然后代碼就不再執(zhí)行了。
          • 大部分情況下,建議使用computed,因?yàn)樗鼡碛凶罴训乃俣龋窃趫?zhí)行異步任務(wù)的時(shí)候,我們只能選擇watch <script src="vue.js"></script> <div id="app"> <button v-on:click="counter1++">Increase Counter 1</button> <p>Counter:{{counter1}}</p> </div> <script> new Vue({ el: "#app", data: { counter1: 0, }, watch: { counter1: function (value) { // 注意:回調(diào)閉包中不允許直接使用this // 因此此處需要先用一個(gè)變量vm來保存this var vm = this; setTimeout(function () { vm.counter1 = 0 }, 2000) } } }); </script>

          028 - 用縮寫來節(jié)省時(shí)間

          • Vue里有兩個(gè)使用頻率很高的指令:v-on和v-bind, 這兩個(gè)指令可以用@符合和:符號(hào)來替代
          • 例如像這樣的代碼是完全符合語法的:
          • 用@號(hào)替代v-on: <button @click="counter1++">Increase Counter 1</button>
          • 用:號(hào)替代v-bind: <a :href="link">Baidu</a>

          029 - 作業(yè):響應(yīng)式屬性

          • 1. 用computed屬性完成對(duì)value的判斷,等于37的時(shí)候result顯示Done,不等于的時(shí)候顯示Not there yet
          <!-- 作業(yè)3問題:響應(yīng)式屬性 - 作業(yè)1 -->
          <script src="vue.js"></script>
          <div id="app">
              <button v-on:click="value += 5">Add 5</button>
              <button v-on:click="value += 1">Add 1</button>
              <p>{{result}}</p>
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      value: 0,
                  },
                  computed: {
                      result: function () {
                          return this.value == 37 ? "Done" : "Not there yet"
                      }
                  }
              });
          </script>
          
          • 2. 監(jiān)視變量value,當(dāng)它有變化的時(shí)候觸發(fā)定時(shí)器,5秒后將它歸零
          • 這一題有幾個(gè)重點(diǎn):
          • 1、watch 不僅可以監(jiān)控data里的屬性,也可以監(jiān)控computed里面的屬性(如result)
          • 2、通過vm可以修改data里的屬性(如value),但是不能修改computed里的result
          • 3、本例是一個(gè)循環(huán)監(jiān)控的例子:起初是按鈕改變了value的值,value==37改變了result的值,result觸發(fā)了定時(shí)器,定時(shí)器又改變了value的值,value的值又反過來影響了result的值
          <script src="vue.js"></script>
          <div id="app">
              <button v-on:click="value += 5">Add 5</button>
              <button v-on:click="value += 1">Add 1</button>
              <p>Current Value:{{value}} </p>
              <p>{{result}}</p>
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      value: 0
                  },
                  computed: {
                      result: function () {
                          return this.value == 37 ? "Done" : "Not there yet"
                      }
                  },
                  watch: {
                      result: function () { //watch可以監(jiān)聽computed里的屬性
                          var vm = this;
                          setTimeout(function () {
                              vm.value = 0
                              // 但無法修改computed里定義的屬性,即如果寫成 vm.result = "XXX" 則程序會(huì)報(bào)錯(cuò)
                          }, 5000)
                      }
                  }
              });
          </script>
          

          031-CSS類動(dòng)態(tài)樣式-基礎(chǔ).html

          • 設(shè)置CSS,demo是一個(gè)div塊,red是顏色
          • 監(jiān)聽click事件,并修改attachRed的值(只有一行代碼,即將attachRed取反)
          • 設(shè)置class值,修改div的class屬性,相當(dāng)于在red: true和red: false之間互相切換。
          • 整個(gè)過程實(shí)際上由兩部分完成,@click事件更改attachRed的值,而:class則負(fù)責(zé)根據(jù)attachRed的值反復(fù)設(shè)置css
          <style>
              .demo {
                  width: 100px;
                  height: 100px;
                  background-color: gray;
                  display: inline-block;
                  margin: 10px;
              }
          
              .red {
                  background-color: red;
              }
              }
          </style>
          <script src="vue.js"></script>
          <div id="app">
              <div
                      class="demo"
                      @click="attachRed = !attachRed"
                      :class="{red: attachRed}"
          
              ></div>
          
          </div>
          
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      attachRed: false
                  }
              });
          </script>

          032-CSS類動(dòng)態(tài)樣式-使用對(duì)象

          • 接上一個(gè)例子,如果我們想讓div塊在紅色和藍(lán)色之間切換怎么辦呢?
          • 首先在style里增加一個(gè)css的blue類: .blue { background-color: blue; } -然后把class屬性改成這樣: :class="{red: attachRed, blue: !attachRed}"
          • 即當(dāng)attachRed為True時(shí)采用red,而當(dāng)attachRed為False的時(shí)候采用blue類。
          • 現(xiàn)在,這個(gè)對(duì)象變長了,而且將來隨著頁面的復(fù)雜還將越來越長,如果我們不想把這一行代碼寫進(jìn)HTML模板里該怎么辦呢?我們可以把樣式對(duì)象作為Vue實(shí)例內(nèi)的計(jì)算屬性來處理。定義一個(gè)computed(計(jì)算)函數(shù)名稱為:divClasses,然后用這個(gè)函數(shù)它來返回Javascript對(duì)象。
          • 完整代碼如下:
          <style>
            .demo {
                width: 100px;
                height: 100px;
                background-color: gray;
                display: inline-block;
                margin: 10px;
            }
            .red {
                background-color: red;
            }
          
            .blue {
                background-color: blue;
            }
          </style>
          <script src="vue.js"></script>
          <div id="app">
            <div
                    class="demo"
                    @click="attachRed = !attachRed"
                    :class="divClasses"
          
            ></div>
          </div>
          <script>
            new Vue({
                el: "#app",
                data: {
                    attachRed: false
                },
                computed: {
                    divClasses: function () {
                        return {
                            red: this.attachRed,
                            blue: !this.attachRed
                        }
                    }
                }
            });
          </script>

          033-CSS類動(dòng)態(tài)樣式-使用命名

          • 傳統(tǒng)的HTML語法里,一個(gè)元素套用某個(gè)CSS類是用class = "類名"
          • 而在Vue里面,則使用 :class = "表達(dá)式",這個(gè)表達(dá)式可以是:
          • 1、 直接使用 CSS類名
          • 2、 使用對(duì)象,類名:布爾值,如red: true或red: false
          • 3、 computed里return的對(duì)象 (如同上一個(gè)例子那樣)
          • 4、 數(shù)組(CSS列表),Vue會(huì)自動(dòng)解析列表中的對(duì)象
          • 原理:
          • 默認(rèn)情況下,本例中第二個(gè)div塊為green, 現(xiàn)在清空輸入框,div框變灰色,因?yàn)樗也坏綄?duì)應(yīng)的css值了。
          • 這個(gè)輸入框是這樣設(shè)置的 :class="[color,{red: attachRed}]",數(shù)組中有兩個(gè)值:
          • 第一個(gè)元素color表示直接用css的類名來設(shè)置css的值
          • 第二個(gè)元素{red: attachRed}能否成立,要看布爾值attachRed是否為true?
          • 兩個(gè)值其中任何一個(gè)成立,css設(shè)置生效,在初始時(shí):
          • 數(shù)組元素1:{red: attachRed}不成立,因?yàn)閍ttachRed為false
          • 數(shù)組元素2:color成立,因?yàn)槟J(rèn)為green, 所以div塊為綠色
          • 清空輸入框后,數(shù)組元素 color 不成立了,加之?dāng)?shù)組元素 {red: attachRed} 本來就不成立,因此div塊變成灰色
          • 此時(shí),如果我們點(diǎn)一下第一個(gè)div塊,則第二個(gè)div塊也跟著變成了紅色,分析:
          • 現(xiàn)在盡管 color 還是不成立,但是 {red: attachRed} 成立了,于是第二個(gè)div塊跟著變成了紅色
          <!-- 033-CSS類動(dòng)態(tài)樣式-使用命名 -->
          <style>
              .demo {
                  width: 100px;
                  height: 100px;
                  background-color: gray;
                  display: inline-block;
                  margin: 10px;
              }
              .red {
                  background-color: red;
              }
              .blue {
                  background-color: blue;
              }
              .green {
                  background-color: green;
              }
          </style>
          <script src="vue.js"></script>
          <div id="app">
              <div
                      class="demo"
                      @click="attachRed = !attachRed"
                      :class="divClasses"
          
              ></div>
              <div
                      class="demo"
                      :class="[color,{red: attachRed}]"
              ></div>
              <hr>
              <!-- 此處輸入框雙向綁定了color屬性,即鍵盤輸入的內(nèi)容會(huì)即時(shí)作為CSS類名傳到HTML中去 -->
              <input type = "text" v-model = "color">
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      attachRed: false,
                      color:'green' 
                      //color屬性默認(rèn)為green,請(qǐng)注意由于雙向綁定的原因,green這個(gè)字符串也會(huì)同時(shí)傳遞到輸入框里
                  },
                  computed: {
                      divClasses: function () {
                          return {
                              red: this.attachRed,
                              blue: !this.attachRed
                          }
                      }
                  }
              });
          </script>

          章節(jié)2課時(shí)34-動(dòng)態(tài)設(shè)置樣式(不使用CSS類)

          • 本課學(xué)習(xí)不用css的class直接設(shè)置css格式
          • 上例中,我們要事先定義三個(gè)css背景顏色的class,然后用 :class 這樣的方式去套用,現(xiàn)在轉(zhuǎn)換一種方法:
          • 直接在div中設(shè)置css屬性,例如 background-color
          • 可以看到,本例中完全沒有設(shè)置red, blue, green這三個(gè)class, 在div塊中是這么處理的:
          <div class="demo" :style="{'background-color':color}"></div>
          • 現(xiàn)在我們用 :style 來直接設(shè)置 background-color,注意格式,必須用單引號(hào)括起來,因?yàn)橹虚g有連字符,如果不用單引號(hào),那就必須改成 backgroundColor 這樣的駝峰命名法,那么color是怎么來的呢?請(qǐng)看這一行:
          data: { color: 'grey', width: 100}
          • 以及這一行:
          <input type="text" v-model="color">
          • vue實(shí)例中,我們定義了一個(gè)color變量(默認(rèn)grey),再用v-model雙向綁定在一個(gè)input輸入框中,于是我們?cè)谳斎肟蛑休斎肴魏畏蟘ss規(guī)則的顏色字符串可以同步生效在div框中(區(qū)別于上一個(gè)例子,我們只能輸入red,green和blue),本例中我們可以輸入yellow, gold, black等等等等,只要符合css語法的顏色都能生效而無需事前定義相對(duì)應(yīng)的class
          • 本課中的第二個(gè)div塊演示的是用類似的方法設(shè)置多個(gè)屬性,比如同時(shí)設(shè)置colorwidth
          • 完整代碼中,我們通過計(jì)算方法設(shè)置一個(gè)myStyle對(duì)象,第二個(gè)div塊直接用:style="myStyle"來套用這個(gè)對(duì)象,以達(dá)到同時(shí)設(shè)置背景顏色和寬度的目的。
          • 完整代碼如下:
          <!-- 章節(jié)2課時(shí)34-動(dòng)態(tài)設(shè)置樣式(不使用CSS類) -->
          <style>
              .demo {
                  width: 100px;
                  height: 100px;
                  background-color: gray;
                  display: inline-block;
                  margin: 10px;
              }
          </style>
          <script src="vue.js"></script>
          <div id="app">
              <div class="demo" :style="{'background-color':color}"></div>
              <div class="demo" :style="myStyle"></div>
              <hr>
              <input type="text" v-model="color">
              <input type="text" v-model="width">
          </div>
          <script>
              new Vue({
                  el: "#app",
                  data: {
                      color: 'grey',
                      width: 100
                  },
                  computed: {
                      myStyle: function () {
                          return {
                              backgroundColor: this.color,
                              width: this.width + 'px'
                          }
          
                      }
                  }
              });
          </script>
          • 章節(jié)2課時(shí)35-用數(shù)組語法設(shè)置元素樣式 有了上一節(jié)課的鋪墊,這一節(jié)課理解起來會(huì)顯得很容易。 本例中我們?cè)黾恿说谌齻€(gè)div塊,而這個(gè)div塊是采用數(shù)組語法來設(shè)置css樣式的,參見代碼: <div class="demo" :style="[myStyle,{height: width + 'px'}]"></div> 這個(gè)div塊的 :style 是由一個(gè)數(shù)組構(gòu)成的,有兩個(gè)元素: myStyle{height: width + 'px'} myStyle 跟上一個(gè)例子一模一樣,不再贅述,第二個(gè)元素表示追加一個(gè)css屬性: height 這個(gè)例子中,我們并沒有在vue實(shí)例的計(jì)算屬性中添加 height 這個(gè)屬性,但它依然生效,也就是說,在一個(gè)div塊中,我們套用css樣式的方法是多種多樣的,現(xiàn)在總結(jié)一下: 第一個(gè)div框中,直接采用css關(guān)鍵字 'background-color' 第二個(gè)div框中,采用計(jì)算方法( computed )return 一個(gè)css樣式(多屬性) 第三個(gè)div框中,采用數(shù)組的方式設(shè)置css,在這個(gè)框中,我們同時(shí)采用了計(jì)算方法和css關(guān)鍵字直接設(shè)置法,相當(dāng)于第一個(gè)div框和第二個(gè)div框的合體。 完整代碼如下:

          主站蜘蛛池模板: 国产免费无码一区二区| 国内精品视频一区二区三区八戒| 色噜噜一区二区三区| 风间由美在线亚洲一区| 国产精品一区二区资源| www.亚洲一区| 一区二区三区观看免费中文视频在线播放| 国产丝袜美女一区二区三区| 精品无码一区二区三区亚洲桃色| 一本一道波多野结衣一区| 痴汉中文字幕视频一区| 日本不卡一区二区三区| 麻豆精品人妻一区二区三区蜜桃| 国产一区二区三区福利| 久久久国产精品一区二区18禁| 亚洲午夜一区二区三区| 日本一区二区三区不卡视频中文字幕| 丰满人妻一区二区三区免费视频| 文中字幕一区二区三区视频播放| 国产伦精品一区二区三区不卡| 国产无人区一区二区三区| 久久亚洲一区二区| 免费无码一区二区| 亚洲av乱码一区二区三区| 视频一区二区精品的福利| 色欲综合一区二区三区| 亚洲第一区在线观看| 亚洲AV成人一区二区三区在线看| 国产AV国片精品一区二区| 中文激情在线一区二区| 国产亚洲3p无码一区二区| 女同一区二区在线观看| 日韩免费无码一区二区三区| 视频在线一区二区| 中文字幕一区日韩精品| 国产午夜精品一区二区三区嫩草| 日韩免费无码一区二区视频| 中文字幕亚洲综合精品一区| 国产一区二区四区在线观看| 国产精品无码一区二区三区在 | 国产萌白酱在线一区二区|