Vue的基础语法

Vue的基础语法

一、插值操作

​ 1.使用Mustache语法获取data中的数据

示例:

<div id="app">
  <h2>{{firstName +" "+ lastName}}</h2>
  <h2>{{firstName}} {{lastName}}</h2>
</div>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      firstName:"Lebron",
      lastName:"James"
    }
  });
</script>

使用Mustache语法显示在浏览器中的数据是响应式的,若是data中的数据改变了,浏览器中显示的数据也会动态的改变,这很好用,若是从服务器中动态的获取到数据,就不需要先获得元素,再进行追加了。

​ 2.有时候某些东西,我们不想要它响应式的改变,这个时候可以使用v-once指令

<div id="app" v-once>{{message}}</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        message: 'hello world!'
      }
    });
  </script>

可以打开控制台,输入app.message = "hello vue!",可以看见,虽然message的值修改了,但是页面显示的数据并没有动态的改变。

​ 3.有时可能我们想要显示的数据是一个html类型的数据,就像是含有html标签这样子的数据,这个时候若是直接使用Mustache语法肯定解析不了html标签。这个时候就可以使用一个v-html指令,这就像是给这个元素添加了innerHTML值一样。

<div id="app" v-html="baidu"></div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        baidu:"<a href='http://www.baidu.com'>百度一下</a>"
      }
    });
  </script>

​ 4.v-text指令和Mustache语法差不多,都是取出数据插入元素中,应该就和innerText差不多吧。

<div id="app">
  <h2 v-text="message"></h2>
</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
      message: 'Hello World!'
      }
    });
  </script>

​ 5.v-pre指令应该和pre标签差不多,使用了这个标签之后就不会对其中的文本进行语法的解析。

<div id="app" v-pre>{{message}}</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
      message: '你好呀'
      }
    });
  </script>

像是这串代码在页面中显示的就是{{message}}而不是你好呀,因为没有进行Mustache语法的解析。

​ 6.有时候,若是我们在准备数据的时候需要花一定的时间,而这个时候Mustache语法显示的直接是语法格式的文本,然后会有个闪动后出现我们想要显示的数据。这种情况对用户来说体验是非常不好的,所以还不如在加载完成之前先不要显示呢。这个时候就可以使用到v-cloak指令,cloak是斗篷的意思,寓意在没加载完成之前先使用斗篷把数据盖起来,别让用户看到先。

<div id="app">{{message}}</div>
  <script src="../js/vue.js"></script>
  <script>
    setTimeout("const app = new Vue({\n" +
        "      el: '#app',\n" +
        "      data: {\n" +
        "      message: 'hello vue!'\n" +
        "      }\n" +
        "    });",1000);
  </script>

这串代码就可以演示闪动的场景,你可以感受到,的确不是很友好。

<style>
    [v-cloak]{
      display: none;
    }
  </style>
</head>
<body>
<div id="app" v-cloak>{{message}}</div>
  <script src="../js/vue.js"></script>
  <script>
    setTimeout("const app = new Vue({\n" +
        "      el: '#app',\n" +
        "      data: {\n" +
        "      message: 'hello vue!'\n" +
        "      }\n" +
        "    });",1000);
  </script>

结合style属性选择器,当app加载完成之后它会把v-cloak给去掉,就是拿走斗篷,底下的数据就显示出来了。

通过上面的指令和Mustache语法,我们能够动态的更新元素中的文本内容,但是有的时候像是a标签中的href,img标签中的src,我们也想要动态的进行更新,这就需要进行动态绑定属性操作。

二、动态绑定属性操作

​ 1.v-bind用于绑定一个或者多个属性值

示例:动态绑定a标签的href和img标签的src

<div id="app">
  <a v-bind:href="linkVue">vue官网</a>
  <img v-bind:src="vueLogo" alt="">
</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        linkVue:"https://cn.vuejs.org/",
        vueLogo:"https://cn.vuejs.org/images/logo.png"
      }
    });
  </script>

v-bind有个语法糖写法,就是为了简化它的书写,给各位程序员一点甜头的意思。语法糖写法就是直接一个":"

<div id="app">
  <a :href="linkVue">vue官网</a>
  <img :src="vueLogo" alt="">
</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        linkVue:"https://cn.vuejs.org/",
        vueLogo:"https://cn.vuejs.org/images/logo.png"
      }
    });
  </script>

这就是语法糖写法,结果没有变化。

​ 2. v-bind绑定class,很多时候我们会希望动态的切换class,比如说音乐的点击和关闭等等。v-bind绑定class有两种方式,分别是对象语法和数组语法

​ 2.1 v-bind绑定class,对象语法

对象语法简述:

<div id="app">
  <h2 v-bind:class="{active:true,line:false}">{{message}}</h2>
</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
      message: '为了部落!!!'
      }
    });
  </script>

v-bind绑定class的对象语法就是像这样以键值对的方式,不过value是一个布尔值,表示这个class是否添加上去。

<div id="app">
  <h2 v-bind:class="{active:isActive,line:isLine}">{{message}}</h2>
</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        message: '为了部落!!!',
        isActive:true,
        isLine:false
      }
    });
  </script>

这样就能动态的添加或者删除该类了

下面例子演示,点击文字切换红色。

<div id="app">
  <h2 v-bind:class="{active:isActive,line:isLine}" v-on:click="textClick">{{message}}</h2>
</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        message: '为了部落!!!',
        isActive:true,
        isLine:false
      },
      methods:{
        textClick:function () {
          this.isActive = !this.isActive;
        }
      }
    });
  </script>

vue这个响应式的设计真的很方便,很好玩。

2.2v-bind绑定class,数组语法

<h2 v-bind:class="[active,line]">{{message}}</h2>
  <h2 v-bind:class="getClass()">{{message}}</h2>
  <h2 v-bind:class="classes">{{message}}</h2>
</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        message: '你好啊,李银河!',
        active:"sdfdsfsdf",
        line:"sdfsdf"
      },
      methods:{
        getClass:function () {
          return [this.active,this.line];
        }
      },
      computed:{
        classes:function () {
          return [this.active,this.line];
        }
      }
    });
  </script>

这就是数组语法绑定class,注意数组中的元素不能加单引号,不然就当作字符串而不是变量解析了。可能你会觉得直接写在class中有点长了,那么可以用一个函数或者计算属性来获取。

  1. v-bind绑定style,同样也有对象语法和数组语法,这里就一起展示了

    <div id="app">
      <h2 v-bind:style="{fontSize:font + 'px',color:color}">{{message}}</h2>
      <h2 v-bind:style="[myFontSize,myColor]">{{message}}</h2>
      <h2 v-bind:style="[finalFontSize,finalColor]">{{message}}</h2>
    </div>
      <script src="../js/vue.js"></script>
      <script>
        const app = new Vue({
          el: '#app',
          data: {
            message: '你好啊,李银河!',
            font:50,
            color:'red',
            myFontSize:{fontSize:50+'px'},
            myColor:{color:'red'}
          },
          computed:{
            finalFontSize:function () {
              return {fontSize:this.font+"px"};
            },
            finalColor:function () {
              return {color:this.color};
            }
          }
        });
      </script>
    

三、计算属性

有些时候我们想展示的数据不只是一个,而是多个数据进行一定的处理之后再展示的,这时候直接使用Mustache语法的话可能无法满足需求,所以vue中有个叫做计算属性的东西,就是上面例子中我在computed中定义的函数,这些虽然是函数,但是它起到的效果是和属性差不多的,调用的时候不需要加小括号。

下面就以一个计算书本总价格的例子来使用一下吧。

<div id="app">
  <h2>总价格:{{totalPrice}}</h2>
</div>

<script src="../js/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      books: [
        {id: 110, name: 'Unix编程艺术', price: 119},
        {id: 111, name: '代码大全', price: 105},
        {id: 112, name: '深入理解计算机原理', price: 98},
        {id: 113, name: '现代操作系统', price: 87},
      ]
    },
    computed: {
      totalPrice:function () {
        let total = 0;
        for(let i = 0;i < this.books.length;i++){
          total += this.books[i].price;
        }
        //这种for循环取出来的i是books中的指定下标的元素,就和forEach差不多
        // for(let i of this.books){
        //   total += i.price;
        // }
        
        //这种for循环取出来的i是下标,就和for(let i = 0;i < this.books.length;i++)差不多
        // for(let i in this.books){
        //   total += this.books[i].price;
        // }
        return total;
      }
    }
  })
</script>
计算属性的setter和getter

其实上面的例子是一个简化的写法,按照javabean的思想,一个属性是要有set和get方法的,这里其实也是这样,不过一般只是作为数据展示,不希望进行改变数据的值,所以就省略的set方法。

<div id="app">
  <h2>{{fullName}}</h2>
</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        firstName:"Lebron",
        lastName:"James"
      },
      computed:{
        fullName:{
          set(fullName){
            let names = fullName.split(" ");
            this.firstName = names[0];
            this.lastName = names[1];
          },
          get(){
            return this.firstName + " " + this.lastName;
          }
        }
      }
    });
  </script>
为什么在数据展示的时候推荐使用计算属性而不是方法呢?

这涉及到计算属性的设计,因为计算属性是具有缓存的,多次调用其实只是执行了一次,而方法没有缓存,调用了多少次就执行了多少次,这就产生了性能和效率上的浪费。

<div id="app">
  <h2>{{fullName}}</h2>
  <h2>{{fullName}}</h2>
  <h2>{{fullName}}</h2>
  <h2>{{fullName}}</h2>
  <h2>{{fullName}}</h2>
  <h2>{{fullName}}</h2>
  <h2>{{getFullName()}}</h2>
  <h2>{{getFullName()}}</h2>
  <h2>{{getFullName()}}</h2>
  <h2>{{getFullName()}}</h2>
  <h2>{{getFullName()}}</h2>
  <h2>{{getFullName()}}</h2>
  <h2>{{getFullName()}}</h2>
  <h2>{{getFullName()}}</h2>
</div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        firstName : "Lebron",
        lastName : "James"
      },
      computed:{
        fullName(){
          console.log("the computed is running...");
          return this.firstName + " " + this.lastName;
        }
      },
      methods:{
        getFullName(){
          console.log("the method is running...");
          return this.firstName + " " + this.lastName;
        }
      }
    });
  </script>

打开控制台,可以看见每调用一次方法,方法就会执行一次。而计算属性只会执行一次,两个效率高下立分

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,207评论 0 6
  • 一、了解Vue.js 1.1.1 Vue.js是什么? 简单小巧、渐进式、功能强大的技术栈 1.1.2 为什么学习...
    蔡华鹏阅读 3,319评论 0 3
  • 1. Vue 实例 1.1 创建一个Vue实例 一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实...
    王童孟阅读 1,019评论 0 2
  • vue.js简介 Vue.js读音 /vjuː/, 类似于 viewVue.js是前端三大新框架:Angular....
    LiWei_9e4b阅读 497评论 0 0
  • vue学习笔记 安装 Vue 提供一个官方命令行工具,可用于快速搭建大型单页应用。只需几分钟即可创建并启动一个带热...
    EL_PSY_CONGROO阅读 1,059评论 0 5