vue.js基础

使用vue,js第一步先是安装(http://cn.vuejs.org/)
在官方文档中就可以直接下载并用 <script>标签引入,记住本地的Vue.js的位置,通过会被注册为一个全局变量。如:

     <script type="text/javascript" src="D:\软件小组/vue.js"></script>
vue介绍

vue是一套构建用户界面的 渐进式框架,Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定组合的视图组件

最基本的实现方法:

      <div id="app" >
          {{message}}        //输出的纯文本用双大括号括着
      </div>
      <script type="text/javascript" >
        var vm=new Vue({
              el:'#app',    //元素的id
              data:{         //元素包含的数据
                  message:"good"
                  }
             })

Paste_Image.png

可以通过控制台console改变数据
这样的话可以多次改变数据,而通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新,另外一种就是在{{message}}改为{{*message}},同样也只能赋值一次

    <div id="app" >
      {{*message}}
    </div>
    <script type="text/javascript" >
      var vm=new Vue({
      el:'#app',
      data:{
        message:"hello"
      }
  })
      vm.message="wonderful";
    </script>        //hello

如果要输出真正的 HTML ,你需要使用v-html指令:

      <div id="app" >
        <div v-html="name"></div> //name为HTML代码,直接可以输出不需要双大括号
      </div>
      <script type="text/javascript" >
          var vm=new Vue({
          el:'#app',
          data:{
          name:"Amy",
            }
        })
      </script>

注意,你不能使用 v-html来复合局部模板,因为 Vue 不是基于字符串的模板引擎。组件更适合担任 UI 重用与复合的基本单元。

你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容插值。*

条件与循环
    <div id="app" >
        <p v-if="look">{{message}}       //v-if 语句的形式,通过look的布尔值决定是否执行
        </p>
    </div>
    <script type="text/javascript" >
        var vm=new Vue({
        el:'#app',
        data:{
          message:"good",
          look:true
              }
        })         //good

在通过控制台输出vm.look=false使得good的输出消失

循环:

    <div id="app" >
        <div v-if="look" >
          <p v-for="item in items">{{item.message}}     相当于 i in array的循环
          </p>
      </div>
    </div>
    <script type="text/javascript" >
      var vm=new Vue({
      el:'#app',
      data:{
         items:[               //数组和对象的要小心这些括号
              {message:"good"},
             {message:"study"},
             {message:"children"}
                  ],
        look:true
            }
         })

    </script>

Paste_Image.png

还可以在控制台上增添新的message

     vm.items.push({message:"better"})   
Paste_Image.png
事件

v-on事件

     <div id="app" >
        <button v-on:click="hello">Hello</button>   v-on进行连接click点击函数
    </div>
    <script type="text/javascript" >
      var vm=new Vue({
       el:'#app',
      methods:{            //方法
       hello:function() {
         alert("hey,girl");
                        }
               }
        })

    </script>
Paste_Image.png


<a v-on:click="doSomething"></a>

<a @click="doSomething"></a>

Vue 也提供了 v-model 指令,它使得在表单输入和应用状态中做双向数据绑定变得非常轻巧。如:

    <div id="app" >
        {{message}}
        {{name}}
        <br>
        <input v-model="name">
    </div>
    <script type="text/javascript" >
        var vm=new Vue({
        el:'#app',
        data:{
          message:"hello",
          name:''
        }
      })
      </script>
Paste_Image.png

v-bind指令绑定class

    <style type="text/css">
      .active{
          color:red;
        }
      .static{
          background:green;
        }
    </style>
    <div id="app" v-bind:class="{active:isActive,static:isStatic}">
        {{message}}
    </div>
    <script type="text/javascript" >
        var vm=new Vue({
               el:'#app',
               data:{
                   isActive:true,
                   message:'beauty',
                   isStatic:true
                 },  
        })//class属性的bind的

Paste_Image.png

//绑定Style属性

    <style type="text/css">
      .active{
      font-family:'Comic Sans Ms';
      background:blue;
      }  
  </style>
    <div id="app">
        <div v-bind:class="{active:isActive}">
            <div v-bind:style="{color:activeColor,fontSize:fontSize}">
            {{message}}
            </div>
        </div>
    </div>
<script type="text/javascript" >

  var vm=new Vue({
       el:'#app',
       data:{
       activeColor:'orange',
       message:"dodo",
       isActive:true,
       fontSize:'50',
     }
})

Paste_Image.png

//如果是想同时绑定两个东西,应该要多个包装,否则就会没有什么效果直接忽略后面的绑定,例如不能在同一个div中用bind绑定两个
bind语法

<a v-bind:href="url"></a>

<a :href="url"></a>

计算属性

在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作。在模板中放入太多的逻辑会让模板过重且难以维护。如:
<div id="example">
{{ message.split('').reverse().join('') }}
</div>

computed例子:

 <div id="app">
   <p>{{message}}</p>
   <p>{{reverseMessage}}</p>
 </div>
<script type="text/javascript" >
    var vm=new Vue({
       el:'#app',
       data:{
       message:'live'

       },
       computed:{
       reverseMessage:function() {
       return this.message.split('').reverse().join('')
       }
       }
    })          

结果:
live
evil
这个目的同样可以用methods的形式实现,但是对于methods,是每次执行都会重新调用一次函数,再从头开始,而对于计算属性来说,是基于它的依赖缓存,也就是说只要message的值不变,计算属性会一下子就出现之前出现的结果,而method又要经过冗长的过程

Vue.js 提供了一个方法 $watch ,它用于观察 Vue 实例上的数据变动

    computed: {
      classObject:function() {
        return {
            active:this.isActive && !this.error,
            'text-danger':this.error && this.error.type==='fatal',    //这是什么意思
            }
        }
    }
v-if条件渲染
    <div id="app">
    <div v-if="ok">{{message}}</div>
    </div>
    <script type="text/javascript" >
        var vm=new Vue({
         el:'#app',
         data:{
             message:"dodo",
             ok:true
         }
    })
  </script>   //注意的是v-if不能直接写在根元素上 
template方法

<template>元素当做包装元素,并在上面使用 v-if,可以用来切换多个元素

    <div id="app" > 
      <template v-if="ok">
        <div  v-bind:style="{color:activeColor}">
          <h1>Title</h1>
          <p>Paragraph</p>
        </div>
      </template>
      {{message}}
     </div>
  <script type="text/javascript" >
      var vm=new Vue({
           el:'#app',
           data:{
           activeColor:'orange',
           message:"dodo",
           ok:true
         }
    })
  </script>
Paste_Image.png

可以用 v-else指令给 v-if 或 v-show添加一个 “else” 块:
v-else元素必须紧跟在 v-if或 v-show 元素的后面——否则它不能被识别

  <div id="app" > 
    <template v-else>
        {{message}}
    </template>
  </div>
  <script type="text/javascript" >
      var vm=new Vue({
           el:'#app',
           data:{
               activeColor:'orange',
               message:"dodo",
               ok:true
           }
      })           //无效果

v-show另一个根据条件展示元素的选项是 v-show 指令
用法大体上一样:

 <h1 v-show="ok">Hello!</h1>

与v-if不同的是有 v-show的元素会始终渲染并保持在 DOM 中。v-show
是简单的切换元素的 CSS 属性 display

注意: v-show不支持 <template>语法,但是不会报错。

template v-for句式

    <div id="app" > 
      <ul>
         <template v-for="item in items">
             <li>{{item.message}}</li>
             <li v-bind:class="{active:isActive}"></li>
        </template>
      </ul>
    </div>
  <script type="text/javascript" >
        var vm=new Vue({
            el:'#app',
             data:{
                 isActive:true,
                 activeColor:'orange',
                 items:[
                    {message:"dodo"},
                    {message:"foolish"}
                   ]
               }
          })
    </script>             
Paste_Image.png

列表渲染

      <style type="text/css">
        .active{
             font-family:'Comic Sans Ms';
             background:blue;
        }
      </style>
    <div id="app" > 
        <ul>
             <template v-for="(value,key) in items">    //遍历
                 <li v-bind:class="{active:isActive}">      //绑定class
                   {{$index}}.{{key}}:{{value}}</li>        //输出值
             </template>
        </ul>
      </div>
  <script type="text/javascript" >
       var vm=new Vue({
          el:'#app',
          data:{
             isActive:true,
             activeColor:'orange',
             items:{
                  wonder:"dodo",
                  message:"foolish"
                 }
             }
         })  
</script>
Paste_Image.png
    <div id="app" v-for="item in items">
        {{item.message}}
    </div>
    <script type="text/javascript" >
          var vm=new Vue({
              el:'#app',
              data:{
              items:[{message:"baby"}]
              }
          })
      </script>

结果:
baby
在控制台输入

    vm.items.push({message:"good"})
Paste_Image.png

再输入

    vm.items.pop()

输出:


Paste_Image.png

数组的变异方法手段还有

  • push()
  • pop()
  • shift() //从头部开始删除元素
  • unshift() //从头部开始增加元素
  • splice()
  • sort()
  • reverse()

#########注意

由于 JavaScript 的限制, Vue 不能检测以下变动的数组:

  • 当你直接设置一个项的索引时,例如:
    vm.items[indexOfItem] = newValue
  • 当你修改数组的长度时,例如:
    vm.items.length = newLength

解决第一个问题的方法:

// Vue.set
Vue.set(example1.items, indexOfItem, newValue)

// Array.prototype.splice`
example1.items.splice(indexOfItem, 1, newValue)

    var vm=new Vue({
          el:'#app',
          data:{
            items:[{message:"baby"},
                   {message:"hello"},
                   {message:"good morning"}
                  ]
              }
        })
    vm.items.splice(2,1,{message:'beauty'})  //改变数组中特定位置元素的值
Paste_Image.png

解决第二个问题的方法:

example1.items.splice(newLength)

对于所有的数据绑定, Vue.js 都提供了完全的 JavaScript 表达式支持。然而这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式,语句不会解析

    {{number+1}}    <!--把语句包含在双大括号内--!>

    <!-- 这是语句,不是表达式 -->
    {{ var a = 1 }}

    <!-- 流控制也不会生效,请使用三元表达式 -->
    {{ if (ok) { return message } }}
事件修饰符

通过由点(.)表示的指令后缀来调用修饰符,处理 DOM 事件细节

  • stop
  • self
  • prevent
  • capture

  • <a v-on:click.stop="doThis"></a>

  • <form v-on:submit.prevent="onSubmit"></form>

  • <a v-on:click.stop.prevent="doThat"></a>

  • <form v-on:submit.prevent></form>

  • <div v-on:click.capture="doThis">...</div>

  • <div v-on:click.self="doThat">...</div>

#######按键修饰符
最常用例子:

    <input v-on:keyup.enter="submit">//用回车键进行操作提交

其他的常用键

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

推荐阅读更多精彩内容