事件、样式绑定、条件渲染、循环渲染-vue2

事件

1.方法的写法

在methods中写方法,供事件或者别的方法内部调用
方法的写法:由于是做了es6语法处理的 所以学过的所有方式的写法都行

new Vue({
  el:"#app",
  data:{},	
  methods:{
      fn1(){console.log("fn1")},
      fn2:function(){console.log("fn2")},
      fn3:()=>{console.log("fn3")},
      fn4(){
           this.fn3()},
      fn5,
      fn6					
    }
})

2.事件绑定

//v-on: 和  @ 都是绑定事件的指令
//指令后面跟事件类型,值就是methds中的方法,可以加小括号也可以不加
<button v-on:click="fn1()">点击事件1</button>
<button @click="fn2">点击事件2</button>

3.事件修饰符

  • .stop 阻止冒泡,阻止从当前元素经过的所有冒泡行为
  • .prevent 阻止默认事件
  • .capture 添加事件侦听器时让事件在捕获阶段触发
  • .self 其他元素的事件触发时 事件链经过它,无论是捕获还是冒泡阶段都不会触发它的事件,只有它自己是精准对象才会触发事件, 虽然它自己不会被别人影响,但是它自己的事件触发的时候还是会生成事件链经过其他元素,并不阻止继续冒泡到其他元素
  • .once 事件只触发一次,触发完之后,事件就解绑
  • 多修饰符一起使用:连点
<div id="app">
      <!-- 方法+事件绑定+阻止冒泡 -->
      <div v-on:click.capture="fn1" class="box1">
        {{rwx1}}
        <!-- .self+.stop -->
        <div v-on:click.stop.self="fn2" class="box2">
          {{rwx2}}
          <!-- .stop -->
          <div v-on:click.stop="fn3" class="box3">{{rwx3}}</div>
        </div>
      </div>
      <!-- 阻止默认事件 -->
      <a v-on:click.prevent.once="fn" href="http:www.baidu.com">百度</a>
      <div v-on:click="fn4" class="box4"></div>
    </div>
    <script>
      new Vue({
        el: "#app",
        data: {
          rwx1: "rwx1",
          rwx2: "rwx2",
          rwx3: "rwx3",
        },
        methods: {
          fn1() {
            console.log(11111);
          },
          fn2() {
            console.log(22222);
          },
          fn3() {
            console.log(33333);
          },
          fn4() {
            this.fn1();
            this.fn2();
            this.fn3();
          },
        },
      });
    </script>

样式绑定

1 、对class 属性进行绑定

<!--对象语法,v-bind:class 指令也可以与普通的 class 属性共存-->
<div class="static" v-bind:class="{ active: isActive, 'text-danger': hasError }">
</div>
<div v-bind:class="classObject"></div>

对应js 中的data:
data: {
  isActive: true,
  hasError: false,
  classObject: {
    active: true,
    'text-danger': false
  }
}

<!--数组语法,这样写将始终添加 errorClass,但是只有在 isActive 是真值时才添加 activeClass-->
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
<div v-bind:class="[{ active: isActive }, errorClass]"></div>

2、对style 进行绑定

<!--对象语法-->
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
<div v-bind:style="styleObject"></div>

对应js 中的data:
data: {
  activeColor: 'red',
  fontSize: 30,
  red1:"red",
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}

<!--数组语法,可以将多个样式对象应用到同一个元素上-->
<div v-bind:style="[baseStyles, overridingStyles,{color:red1}]"></div>

条件渲染

v-if /v-else 或者 v-show

        <div id="app">
			<div v-if="flag">666</div>
			<div v-show="flag">777</div>
		</div>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				data: {
					flag:false
				}
			})
//1.使用的变量为true就显示,false就隐藏			
//2.在业务中常常可以通过操作if或者show使用的变量,来达到操作元素显示和隐藏的效果
//3.v-if的做法是删除节点,v-show做法是操作css的display:none

visibility: hidden; 不脱离文档流的
display:none        脱离文档流
v-if                删除节点
v-show              display:none	

//4.这个两个谁好?(面试)
//根据它们底层的设计不一样有各自的使用场景
// v-if具有较高的 切换消耗,常常用在用户不常切换的模块
// v-show具有较高的性能消耗,常常用在频繁切换的模块中		

循环渲染

1.for和if放在了同一个标签中 没有先后顺序的要求,但是先执行for

渲染过程为:对arr每一项先做map循环判断v-if给出的条件,再做一遍for 循环渲染

这样引起的问题是:arr 数组新增一项数据时,会对每一项再做一遍v-if 循环,然后for 循环渲染

2.解决方案把for弄到最外层(面试)

如果if和for套在一层,数据容器发生变化时,if会重新判断一遍
嵌套的写法 数据容器变化时 if只判断新增的数据
这样当arr 数组某一项数据发生变化时,只对新增的数据进行v-if 判断,节约渲染效率

这样又会产生新的问题:外层for的div会也创建一个挂载到DOM中
解决方案:wx采用的是block元素 vue呢? template 其实就是dom操作中的fragment
template 其实就是dom操作中的fragment

<div v-for="(item,index) in arr2" :key="item.id">
				<div class="box" v-if="item.age>=18">
					<p>{{item.name}}</p>
					<p>{{item.age}}</p>
					<p>{{item.info}}</p>
				</div>
</div>

vue外层for的div会也创建一个挂载到DOM中解决方案—— template 其实就是dom操作中的fragment

<body>
		<div id="app">
			<div v-for="el in arr3">
				<h1>{{el.name}}</h1>
				<template v-if="el.age>10">
				  <div v-for="el in el.titles">{{el}}</div>
				</template>
				<!-- <div v-for="el in el.titles"  v-if="el.age>10">{{el}}</div> -->
				<!-- <div id="" class=""></div> -->
			</div>
		</div>
		<script>
			var vm=new Vue({
				el:"#app",
				data:{
					arr3: [{
						name: "css",
						age:37,
						titles: ["宽度", "高度", "原角度","颜色"]
					}, {
						name: "js",
						age:20,
						titles: ["变量"]
					},{
						name: "html",
						age:90,
						titles: ["标签"]
					}]
				}
			})
			
			//vue2.0 中v-if  v-for  写到一个元素 v-for的优先级更高
			//解决方案:1.写成嵌套关系 2."冰"元素:template
			//vue3.0 不能写到一起  不然报错
		</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值