Vue的简单概述,Vue的基础使用,Vue的常用指令-01

20170926day01


一.Vue的简单概述

什么是框架?

框架指的是一套非常优秀可被反复使用的代码,帮助开发者解决一些复杂的问题

框架的好处?

提高了代码的复用率
降低模块之间的耦合度
提高开发速度
提高代码质量

Vue是什么?

它是一个实现UI层的渐进式js框架,所谓的渐进式就是你可以一步一步的,有阶段性的来使用Vue。在Vue.js的设计上采用MVVM(Modol-View-ViewModel)模式。

为什么学习Vue?

非常好的中文文档
学习曲线比较缓和(容易上手)
速度快
体积小
基于组件化(web component)的开发方式
代码的可读性、可维护性比较好

如何使用Vue?

搭建环境有两种方式:

方式1:CLI(command line interface 命令行窗口)

    #安装nodejs
        https://nodejs.org/en/
    #全局安装 vue-cli
     npm install --global vue-cli
    #创建一个基于 webpack 模板的新项目
     vue init webpack my-project
    #安装依赖,走你
     cd my-project
     npm install
     npm run dev

方式2:直接引入对应的js文件

二.Vue的基础使用


数据绑定

通过new的方式来得到了Vue的实例,在new通过一个对象来对Vue的实例配置(el,data);el指的是页面中已经存在的DOM元素,可以写选择器。
接触了双花括号(mustache/interpolation)的语法:可以读取变量的值 显示在调用的元素的innerHTML中

<!DOCTYPE html>
<html>

<head lang="en">
  <meta charset="UTF-8">
  <script src="js/vue.js"></script>
  <title>这是一个简单例子</title>
</head>

<body>
  <div id="container">
    <div>{{msg}}</div>
    <div>{{car.brand}}</div>
    <div>{{3+5}}</div>
    <div>{{count>totalNum?'数据超过限制了':'正常'}}</div>
    <div>{{!hasMore}}</div>
  </div>
  <script>
    new Vue({
      el: '#container',
      data: {
        msg: 'Hello VueJS',
        car: {
          brand: 'Volvo',
          price: 30
        },
        count: 2,
        totalNum: 10,
        hasMore: true
      }
    });
  </script>
</body>

</html>

三.Vue的常用指令


1.循环指令

1.<any v-for=" item in items"></any>, 根据in关键词后的集合,去循环创建多个标签。

<!-- vue文件中-->
<ul>
    <li v-for="item in myList">
        {{item}}
    </li>
</ul>
//js文件中
export default {
  data() {
    return {
      myList:[100,200,300,400,500],     
    };
  }, 
};

2.<any v-for="(value,key) in items"></any>支持一个可选参数作为当前项的索引

<ul>
    <li v-for="(value,index) in myList">
        {{value}}-{{index}}
    </li>
</ul>
//js文件中
export default {
  data() {
    return {
      myList:[100,200,300,400,500],     
    };
  }, 
};

3.除数组外,对象属性也是可以遍历的(循环渲染学生列表示例)

<table>
    <thead>
    <tr>
        <th>姓名</th>
        <th>性别</th>
        <th>年龄</th>
    </tr>
    </thead>
    <tbody>
        <tr v-for="tmp in stuList">
            <td v-for="value in tmp">
                {{value}}
            </td>
           <!--<td v-for="(value,key,index) in tmp">遍历对象时有两个可选参数
                {{value}}
            </td>-->
        </tr>
    </tbody>
</table>
export default {
  data() {
    return {
      stuList: [{
          name: 'michael',
          sex: 1,
          age: 20
        },
        {
          name: 'miller',
          sex: 1,
          age: 21
        },
        {
          name: 'lincoln',
          sex: 0,
          age: 23
        },
        {
          name: 'lucy',
          sex: 1,
          age: 22
        },
        {
          name: 'hanmeimei',
          sex: 0,
          age: 19
        }
      ]
    };
  },
};

4.也可以迭代整数

<ul>
    <li v-for="n in 10">
        {{n}}
    </li>
</ul>

2.条件渲染

v-if

v-show="表达式" 根据表达式执行的结果的真假 来切换display显示还是隐藏
<any v-if="表达式"></any>,v-if指令 : 根据表达式执行的结果的真假 来选择是否要挂载到DOM。v-else-if要紧跟v-if,v-else要紧跟v-else-if或者v-if。

<p>{{msg}}</p>
<p v-if="isMember">仅会员可见</p>

<p v-if="answer=='a'">A</p>
<p v-else-if="answer == 'b'">B</p>
<p v-else-if="answer == 'c'">C</p>
<p v-else>D</p>
export default {
  data() {
    return {
      msg: 'Hello Vue',
      isMember: true,
      answer: 'c'
    };
  },
};
v-show

v-show="表达式" 根据表达式执行的结果的真假 来切换display显示还是隐藏

<p>{{msg}}</p>
<p v-show="status===1">当status为1时显示</p>
export default {
  data() {
    return {
     status:1
    };
  },
};

v-show与v-if的用法基本一致,只是v-show是改变css属性display来控制元素显示的,v-if会根据表达式来适当的销毁和重建组件或事件。总之,v-if适合条件不经常改变的场景,因为它的切换开销比较大,v-show适用于频繁切换的条件。

数组更新

vue的核心是数据与视图双向绑定,修改数组时,vue会检测数据变化,vue包含一组观察数组变异的方法,使用它们会触发视图更新。
push()
pop()
shift()
unshift()
splice()
sort()
reverse()从这以上是会改变原数组的
filter()
concat()
slice()从这以上返回新数组但是可替换原来的数组

<table>
    <thead>
    <tr>
        <th>姓名</th>
        <th>性别</th>
        <th>年龄</th>
    </tr>
    </thead>
    <tbody>
        <tr v-for="tmp in stuList">
            <td>{{tmp.name}}</td>    
            <td>{{tmp.sex}}</td>   
            <td>{{tmp.age}}</td>        
        </tr>
    </tbody>
</table>
export default {
  data() {
    return {
      stuList: [{
          name: 'michael',
          sex: 1,
          age: 20
        },
        {
          name: 'miller',
          sex: 1,
          age: 21
        },
        {
          name: 'lincoln',
          sex: 0,
          age: 23
        }     
      ]
    };
  },
};

但是!下列变动的数组中vue无法检测也不会促发视图的更新
1.通过索引直接设置项目,比如this.stuList[3]={...}
解决办法两种
第一种:this.$set(this.stuList,3,{name:'xiaoni',sex:0,age:23});
第二种:this.stuList.splice(3,1,{name:'xiaoni',sex:0,age:23});
2.修改数组长度,比如this.stuList.length=1;
解决办法:this.stuList.splice(1);

Vue事件绑定

<any v-on:eventName="处理函数名字"></any>,通过v-on去给指定的事件绑定一个处理函数。v-on的简写为@。vue提供了一个特殊变量$event,用于访问原生DOM事件。

<p>{{msg}}</p>
<button v-on:click="handleClick">clickMe</button>
<button @click="handleClick">clickMe</button>
<button @click="click(1,$event)">clickMe</button>

<select v-on:change="handleChange">
    <option value="red">红色</option>
    <option value="green">绿色</option>
    <option value="blue">蓝色</option>
</select>


<form v-on:submit.prevent="handleSubmit">
    <input type="checkbox"/>是否同意本站协议<br/>
    <button>登录</button>
</form>
export default {
  data() {
    return {
      msg: 'Hello Vue',
    };
  },
  methods: {
    handleClick: function () {
      console.log('btn is clicked');
    },
    click(data,event){
     console.log(data);
   },
    handleChange: function (event) {
      //方法会默认将原生事件对象event传入
      console.log('选择了某个选项: ' + event.target.value);
    },
    handleSubmit: function () {
      console.log('提交事件被触发了');
    }
  }
};

Vue.js 为 v-on 提供了 事件修饰符。通过由点(.)表示的指令后缀来调用修饰符
.stop
.prevent
.capture
.self
.once
.passive

<!-- 阻止单击事件继续传播 -->
<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>

<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>

<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>

Vue 允许为 v-on 在监听键盘事件时添加按键修饰符:

<input v-on:keyup.enter="submit">

<!-- 缩写语法 -->
<input @keyup.enter="submit">

全部的按键别名:
.enter
.tab
.delete (捕获“删除”和“退格”键)
.esc
.space
.up
.down
.left
.right

其他常用指令

1.v-bind将变量中的值 通过 v-bind 绑定到元素指定的属性,简写是:
<p>{{msg}}</p>
<!-- v-bind实现将变量中值 绑定到属性-->
<img v-bind:src="'img/'+imgUrl"   style="width:80px;height:80px" />
<a v-bind:href="myLink">baidu</a>
<a :href="myLink">baidu</a>

<button @click="modifyBGColor">修改背景色</button>
<h1 v-bind:style="{backgroundColor:myBGColor}">
    背景色会被修改
</h1>

<p v-bind:class="{myRed:isRed}">我的字体颜色会变化</p>

<button v-bind:disabled="!isValid">clickMe</button>

<button v-show="hasMore">加载更多</button>
<p v-show="!hasMore">没有跟多数据可以加载了</p>

<div v-html="myHtml">it is a test</div>
export default {
  data() {
    return {
      msg: 'Hello Vue',
      imgUrl: '1.jpg',
      myLink: 'http://www.baidu.com',
      myBGColor: '#ff0000',
      isRed: false,
      isValid: false,
      hasMore: true,
      myHtml: '<h1>it is a header</h1>'
    };
  },
  methods: {
    modifyBGColor: function () {
      this.myBGColor = '#0000ff'
    }
  }
};
v-text

v-text='变量' 根据变量更新对应的文本内容

v-html

v-html="变量" 根据变量更新对应的innerHTML

Vue中的v-model

v-model指令本身就是一个双向数据绑定的指令:既可以将数据绑定到视图,又可以将视图中的结果绑定到数据。

<button @click="modifyMsg">修改msg</button>
<p>{{msg}}</p> 

<input type="text" v-model.lazy="userAddress"/>
<p>{{"用户输入的结果为"+userAddress}}</p>

<!-- 有两个输入框,一个按钮,
点击按钮时将输入框输入的数据进行求和,将结果输出在控制台-->
<input type="number" v-model.number="num1"/>
<input type="number" v-model.number="num2"/>
<button @click="addSum">add</button>
<input type="text" v-model.trim="myNotes"/>
<p>{{myNotes.length}}</p>
export default {
  data() {
    return {
      msg: 'Hello Vue',
      userAddress: '北京万寿路',
      num1: 0,
      num2: 0,
      myNotes: ''
    };
  },
  methods: {
    modifyMsg: function () {
      this.msg = 'Hello Data Binding';
    },
    addSum: function () {
      console.log(this.num1 + this.num2);
    }
  }
};
v-model的修饰符,用于控制数据同步的时机:

.lazy在输入框中,v-modal默认是在input事件中同步输入框的数据(除了中文输入法),使用.lazy会转变为在change事件中同步,msg的信息不会实时改变,而是在失焦或者按回车时才会更新,示例代码如下:

<input type="text" v-model.lazy="msg"> 
<p>{{msg}}</p>

.number可以将输入转换为Number类型

<input type="text" v-model.number="msg"> 
<p>{{msg}}</p>

.trim 自动过滤输入的首位空格

<input type="text" v-model.trim="msg"> 
<p>{{msg}}</p>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 你有没有很诧异,还没怎么过日子,2017年已经过去四分之一了。从明天开始就进入今年的第二个季度了。作为第一个季度的...
    颜小婧阅读 214评论 0 1
  • 一直很敬佩杨绛先生,洒脱又执着,淡然又清高。 每次想到先生我反到会想起梅长苏,巜琅琊榜》主角,那个...
    清江月阅读 227评论 0 0