vue基础篇

本文主要从vue的基础概念、和其他框架的对比、基础语法、基础指令、计算属性、监听、过滤器以及交互来解读vue框架。

  • vue是什么

Vue.js是一个构建数据驱动的web界面的渐进式框架。目标是通过尽可能简单的API实现响应的数据绑定组合的视图组件。它不仅易于上手,还便于与第三方库或既有项目进行整合。

作者:尤雨溪

注:渐进式框架-----自底向上、增量开发。

       MVC和MVVM框架

     MVC是Model View Controller的简写,即模型(model)-视图(view)-控制器(controller)。

         Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
    通常模型对象负责在数据库中存取数据。

         View(视图)是应用程序中处理数据显示的部分。
    通常视图是依据模型数据创建的。

         Controller(控制器)是应用程序中处理用户交互的部分。
    通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

    MVVM是Model-View-ViewMode的简写,即模型(Model)-视图(View)-视图模型(ViewModel)。

           Model(模型后端传递的数据,

           View(视图所看到的页面,

           ViewModel(视图模型):mvvm模式的核心,它是连接viewmodel的桥梁

      它有两个方向:一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。

  • vue对比angularjs
  1. vue设计之初借鉴了很多angularjs的思想
  2.  vue相对于angular较简单
  3. vue(轻量级框架)比angular(重量级框架)小巧,运行速度较快
  4. vue与angular数据绑定都是双括号插值法{{}}
  5. vue指令用v- xxx                 angularjs用ng- xxx
  6. vue数据绑定在data对象里面,angular数据绑定在$scope

 注:angular和angularjs是两个框架,angularjs出现的比较早     backbaejs框架

  • vue和react对比
  1. vue和react都使用virtual DOM(提高性能,不用加载js脚本)
  2. vue和react都提供了组件化的视图组件
  3. vue和react将注意力集中保持在核心库,有丰富的插件库
  4. react使用jsx渲染页面,vue使用更简单的模板
  5. vue比react运行速度更快
  • vue基础语法
  1. 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的-------Var vm=new Vue({})
  2. 基础属性

          el:获取执行vue的dom元素-----初始化范围

          data:存储数据

          methods:执行的方法

注:构造函数优点:
            1、可以保证该对象属性私有
            2、有proto原型,方法共享,继承

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--bootcdn上面去下载vue插件,或者官网下载-->
		<script src="8-20/js/vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
        /*执行vue的dom元素*/
		<div id="out">
			<h1>{{tit}}</h1>
		</div>
	</body>
	<script type="text/javascript">
		var vm = new Vue({
			el:"#out",
			data:{
				tit:"hello"
			},
			methods:{
				
			}
		})
	</script>
</html>
  • vue基础指令

1.绑定数据

{{}}      双括号插值法 ,只能绑定纯文本,里面可以写表达式,表达式可以是进行简单的逻辑处理,如加减乘除三目运算等

v-text=""  只能绑定纯文本,不解析标签

v-html=""  可以解析html标签

//不带标签
<h1>{{tit}}</h1>
<p v-text="tit"></p>
<p v-html="tit"></p>
//带标签
<p>{{str}}</p>
<p v-text="str"></p>
<p v-html="str"></p>
//vue实例里面
data:{
	tit:"hello",
	str:"<h2>hahaha<h2>",
    }
//{{}}里面可以处理简单逻辑
<h2>{{a*b+a+b}}</h2>
<h2>{{flag?'haha':'www'}}</h2>

//写data里面
a:20,
b:10,
flag:true,

注:绑定html,angular中用的是ng-bind-html,vue用的是v-html

2.事件绑定

v-on:click=""或者@click=""    绑定事件,事件写在method里面

<button @click="tap($event)">事件一</button>
<button v-on:click="tap2()">事件二</button>
<button @click="tap3()">事件三</button>

methods:{
				tap(e){
					console.log(e)
				},
				tap2(){
					this.tit="hi"
				},
				tap3(){
					
				}
			}

注:事件中有event对象时,函数参数为  $event ;操作数据  通过this去操作

3.其他指令

v-for=“item in list”  循环  item循环到的数组值

v-for=“(item,key) in list”  key循环到的下标index

<ul>
	<li v-for="item in list">{{item.name}}----{{item.age}}</li>
</ul>
//data里面
list:[
		{name:"小明",age:"20"},
		{name:"小芳",age:"18"},
		{name:"小红",age:"22"},
]

v-model=“”     表单元素value    不可直接{{}}获取,需在vue初始化设置一下

<input type="text" v-model="ipt" />
<textarea name="" rows="" cols="" v-model="ipt"></textarea>
<input type="checkbox" v-model="ipt" />
<input type="radio" value="男" name="sex" v-model="ipt"/>
<input type="radio" value="女" name="sex" v-model="ipt"/>

<select v-model="ipt">
	<option value="apple">苹果</option>
	<option value="li">梨</option>
	<option value="tao">桃子</option>
</select>
<p>{{ipt}}</p>

//注:一定要在data里面注册ipt=""

v-if   布尔值       为true      代表节点消失

V-show布尔值   为true  代表节点设置了display:none属性

<p v-if="false">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate in asperiores facere provident beatae perspiciatis repellendus deleniti! Vitae iure deleniti veniam rerum corporis fugiat ducimus tempora natus quos sapiente cumque?</p>
<p v-show="false">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate in asperiores facere provident beatae perspiciatis repellendus deleniti! Vitae iure deleniti veniam rerum corporis fugiat ducimus tempora natus quos sapiente cumque?</p>

V-once 一次渲染

<h1 v-once="tit">{{tit}}</h1>
<p v-text="tit"></p>
<p v-html="tit"></p>
<button @click="tap3()">事件三</button>

//data中
tit:"hi"  
//methods中
tap3(){
		this.tit="hello"
}

//结果是v-once中不再渲染

V-if 与 v-else-if v-else 可以构成判断,可以嵌套写,但是不能插入其他结构,否则报错

<p v-if="num>10">{{num}}大于10</p>
<p v-else-if="num>=0&&num<=10">
		<p v-if="num==0">{{num}}等于0</p>
		<p v-else-if="num==10">{{num}}等于10</p>
		<p v-else>{{num}}大于0小于10</p>
<p v-else="num<0">{{num}}小于0</p>

num:9

4.行间样式设置

1)对象的形式设置

v-bind:style=“{ color: activeColor, fontSize: fontSize + ‘px’ }”

   data: {

            activeColor: 'red',

            fontSize: 30

        }

<p v-bind:style="{color:col,background:bac}">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ex eligendi vel laudantium a esse dolorum aut nam modi quod obcaecati quibusdam rerum enim quae! Inventore doloremque sit suscipit reiciendis fuga.</p>

//data里面
col:'red',
bac:'yellow',			

			

2)数组样式形式设置

v-bind:style=“[styleObjectA, styleObjectB]”

data: {

                styleObjectA: {

                    color: 'red'

                },

                styleObjectB: {

                    fontSize: '30px'

                }

            }

<p v-bind:style="[stya,styb]">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente officia neque nulla mollitia optio blanditiis magnam cupiditate quaerat itaque molestias nesciunt aliquam ad sit quis eum inventore modi molestiae? Ex!</p>

//data中
stya:{
		color:'blue',
		border:'1px solid red'
},
styb:{
		background:'pink'
},

注:v-bind:style的对象语法十分直观——看着非常像 CSS,其实它是一个JavaScript对象

5.类名设置

1)一般设置     v-bind:class=“{‘class-a’:isa,‘class-b’:isb}”     Isa    isb  值为true  添加相应类名,为false  不添加类名

<h2 :class="{'is-a':isa,'classb':isb}">类名</h2>
//data中
isa:true,
isb:true,

2)对象形式设置

<div :class="classobj"></div>

classobj:{

  active:true,

  'class-a':true,

  'class-b':true

}

<h2 :class="classobj">类名-变量 </h2>
//data中
classobj:{
		'active':true,
		"classA":false,
		"classB":true
},

注:当有多个类名时建议用对象的形式来设置;v-bind:class可以简写成:class

       绑定属性  v-bind:id=“data内的属性值”     或者    :id=“data内的属性值”   两种方法(src   title  class   name等属性写法一样)

  • vue计算属性

在 Vue.js 中,你可以通过 computed 选项定义计算属性,计算属性  放在computed:{//函数} 中

  1. 和methods相比:计算属性效率高,methods效率低,还需要事件调用。
  2. 和模板相比:模板中的表达式只用于简单的操作,模板是为了描述视图的结构的,模板中放入过多的逻辑会造成模板过重且难以维护。所以Vue.js 将绑定表达式限制为一个表达式。如果需要多于一个表达式的逻辑,应当使用计算属性。
  • vue监听

        ​​​​​​​两种写法:

  1. vm.$watch(‘’,function( newvalue,oldvalue){ })
  2. 直接在vue初始化中通过watch{msg:function(newvalue,oldvalue){}}监听
  • vue过滤器​​​​​​​

       写法:

        Vue.filter(‘过滤器名字’,function(value){

              return  //具体操作

        })

  • vue数据交互

1.  应用fetch或axios 获取数据      axios  是vue2.0提供的方法

需要引入 axios.js,插件网址  https://github.com/mzabriskie/axios

//Eg:get方式
var _that=this;   /*注意this的作用域*/
 axios.get(url)
  .then(function (response) {
      console.log(response.data.result);
       _that.list=response.data.result;
  })
  .catch(function (error) {
        console.log(error);
  });

2.  应用vue-resource获取数据      这是vue1.0提供的方法

<script src="https://cdn.jsdelivr.net/npm/vue-resource@1.3.4"></script>

地址:github  搜索  resource https://github.com/pagekit/vue-resource​​​​​​​

Eg:百度接口
var api='https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=php';
var that=this;
this.$http.jsonp(api,{
    jsonp:'cb'
}).then(function(data){
    console.log(data.body);

    that.list=data.body.s;
            
 },function(){


 })
  • vue键盘事件和冒泡事件
  1. 阻止事件冒泡两种方法:第一种是加.stop--->@click.stop="zii();第二种是e.cancelBubble=true;
  2. 键盘事件两种写法:第一种是后面加键盘英文@keydown.enter="down()";第二种是加键盘代表的ASALL码@keydown.13="down()"
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Vue---事件冒泡和键盘事件</title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="out">
			<div id="fu" @click="fu()">
				父元素
				<button @click.stop="zii()">子元素</button>
				<button @click="zi($event)">子元素</button>
			</div>
			<input type="text" v-model="ipt" @keyup.left="tap()" @keydown.enter="down()"/>
		</div>
	</body>
	<script type="text/javascript">
		var vm = new Vue({
			el:"#out",
			data:{
				ipt:""
			},
			methods:{
				fu(){
					console.log("父元素")
				},
				zi(e){
					e.cancelBubble=true;
					console.log("子元素")
				},
				zii(){
					console.log("zi")
				},
				tap(){
					console.log("松开触发")
				},
				down(){
					console.log("按下触发",this.ipt)
				}
			}
		})
	</script>
</html>

补充:

  1. vue是一款前端框架。前端开发,移动端web app都可以用vuejs,它主要做两件事,一个js数据同步的渲染,第二个模块化开发,组件化开发,提高效率和复用性,第三个,你可以配合很多实用工具,比如router(利用html5控制页面跳转),vuex,页面数据状态管理,vue-resource,数据请求。
  2. 2016年的5月份发布的vue.js2.0,现在最新版本是2.2.6
  3. Vue.js 的运行过程实际上包含两步。第一步,编译器将字符串模板(template)编译为渲染函数(render),称之为编译过程;第二步,运行时实际调用编译的渲染函数,称之为运行过程。 由于 Vue.js 1.0 的编译过程需要依赖浏览器的 DOM

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值