温故知新-Vue

温故知新-Vue

1. v-if和v-show的区别

v-if和v-show同为真时,会将内容显示出来,同为假时,会将内容隐藏。不同的是,v-if是直接没有dom,而v-show的dom会存在,只是用display属性将其隐藏。
推出:v-if有惰性,切换开销更高,v-show的初始化开销更高。所以需要频繁切换时,推荐使用v-show。不需要频繁切换时,推荐使用v-if。

2. v-on和v-bind

v-bind指令用于设置HTML属性:v-bind:href 缩写为 :href

<!-- 完整语法 -->
<a v-bind:href="url">...</a>

<!-- 缩写 -->
<a :href="url">...</a>

<!-- 动态参数的缩写 (2.6.0+) -->
<a :[key]="url"> ... </a>

v-on 指令用于绑定HTML事件 :v-on:click 缩写为 @click

<!-- 完整语法 -->
<a v-on:click="doSomething">...</a>

<!-- 缩写 -->
<a @click="doSomething">...</a>

<!-- 动态参数的缩写 (2.6.0+) -->
<a @[event]="doSomething"> ... </a>

3. ref和$ref

这里推荐一篇个人觉得较详细且通俗易懂的文章:https://blog.csdn.net/chunmeizhang_88/article/details/101628279

4.v-model

Vue中三种数据绑定的方式:

  1. 使用插值的方式:{{ message }}和data{ message }
<body>
	<div id="app">
		{{ message }}
	</div>
	<script>
		var vm = new Vue({
			el: '#app',
			data: {
				message: 'Hello world!'
			}
		})
	</script>
</body>
  1. 使用v-bind单向绑定的方式
		<div id="app">
			<p v-bind:class="{class: isclass}">{{ message }}</p>
		</div>
		<script>
			var vm = new Vue({
				el: '#app',
				data: {
					message: '123456',
					isclass: true
				}
			})
		</script>
		<style>
			.class{
				background-color: red;
				font-size: 33px
			}
		</style>
  1. 使用v-model双向绑定的方式
<div id="app">
	<p>{{ message }}</p>
	<input v-model="message" />
</div>
<script>
	var vm = new Vue({
		el: '#app',
		data: {
			message: 'Hello world!',
		}
	})
</script>
  1. v-model和v-bind的区别
    (1) v-bind是数据绑定,没有双向绑定效果,但不一定在表单元素上使用,任何有效元素上都可以使用;
    (2) v-model是双向绑定,基本上只用在表单元素上;
    (3) 当v-bind和v-model同时用在一个元素上时,它们各自的作用没变,但v-model优先级更高,而且需区分这个元素是单个的还是一组出现的。

5.计算属性,方法和watch

  1. 计算属性computed
		<div id="app">
			<div>原始文字:{{ message }}</div>
			<div>更改后的文字:{{ new_message }}</div>
		</div>
		<script>
			var vm = new Vue({
				el: '#app',
				data: {
					message: 'Hello world!'
				},
				computed: {
					new_message() {
						return this.message.split('').reverse().join('')
					}
				}
			})
		</script>

对于任何复杂逻辑,应当使用计算属性!!!

  1. 方法
		<div id="app">
			<div>原始文字:{{ message }}</div>
			<div>更改后的文字:{{ new_message }}</div>
		</div>
		<script>
			var vm = new Vue({
				el: '#app',
				data: {
					message: 'Hello world!'
				},
				methods: {
					new_message() {
						return this.message.split('').reverse().join('')
					}
				}
			})
		</script>

我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。简单来说:只要 message 还没有发生改变,多次访问 new_message计算属性会立即返回之前的计算结果,因为计算属性调用的是缓存里的值,所以不必每次执行函数。但是使用方法的话,每次访问都需要执行一次函数。
3. watch
虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

<div id="watch-example">
  <p>
    问一个是/否的问题:
    <input v-model="question">
  </p>
  <p>{{ answer }}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script>
<script>
var watchExampleVM = new Vue({
  el: '#watch-example',
  data: {
    question: '',
    answer: '除非你问我问题,否则我不给你答案!'
  },
  watch: {
    // 如果 `question` 发生改变,这个函数就会运行
    question: function (newQuestion, oldQuestion) {
      this.answer = '等着你停止打字……'
      this.debouncedGetAnswer()
    }
  },
  created: function () {
    // `_.debounce` 是一个通过 Lodash 限制操作频率的函数。
    // 在这个例子中,我们希望限制访问 yesno.wtf/api 的频率
    // AJAX 请求直到用户输入完毕才会发出。
    this.debouncedGetAnswer = _.debounce(this.getAnswer, 500)
  },
  methods: {
    getAnswer: function () {
      if (this.question.indexOf('?') === -1) {
        this.answer = '疑问句应该有问号哦。 ;-)'
        return
      }
      this.answer = '思考中...'
      var vm = this
      axios.get('https://yesno.wtf/api')
        .then(function (response) {
          vm.answer = _.capitalize(response.data.answer)
        })
        .catch(function (error) {
          vm.answer = '出错了出错了!  ' + error
        })
    }
  }
})
</script>

在示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。

6.使用key值管理可复用元素

  1. Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做除了使 Vue 变得非常快之外,还有其它一些好处。
		<div id="app">
			<template v-if="loginType === 'username'">
				<label>Username</label>
				<input placeholder="Enter your username">
			</template>
			<template v-else>
				<label>Email</label>
				<input placeholder="Enter your email address">
			</template>
			<br />
			<button v-on:click="changeOne">点我</button>
		</div>
		<script>
		var vm = new Vue({
				el: '#app',
				data: {
					loginType: 'username'
				},
				methods: {
					changeOne() {
						if(vm.loginType === 'username') {
							vm.loginType = 'email'
						} else {
							vm.loginType = 'username'
						}

					}
				}
			})
</script>

那么在上面的代码中切换 loginType 将不会清除用户已经输入的内容。因为两个模板使用了相同的元素, 不会被替换掉——仅仅是替换了它的 placeholder。

  1. 这样也不总是符合实际需求,所以 Vue 提供了一种方式来表达“这两个元素是完全独立的,不要复用它们”。只需添加一个具有唯一值的 key 即可:
		<div id="app2">
			<template v-if="loginType === 'username'">
				<label>Username</label>
				<input placeholder="Enter your username" key="username-input">
			</template>
			<template v-else>
				<label>Email</label>
				<input placeholder="Enter your email address" key="email-input">
			</template>
			<br />
			<button v-on:click="changeTwo">点我</button>
		</div>
		<script>
			var vm = new Vue({
				el: '#app2',
				data: {
					loginType: 'username'
				},
				methods: {
					changeTwo() {
						if(vm.loginType === 'username') {
							vm.loginType = 'email'
						} else {
							vm.loginType = 'username'
						}

					}
				}
			})
		</script>

现在,每次切换时,输入框都将被重新渲染。
注意, label 元素仍然会被高效地复用,因为它们没有添加 key attribute。

7.v-for和v-if

当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。当你只想为部分项渲染节点时,这种优先级的机制会十分有用,如下:

<li v-for="todo in todos" v-if="!todo.isComplete">
  {{ todo }}
</li>

上面的代码将只渲染未完成的 todo。

而如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或 ) 上。如:

<ul v-if="todos.length">
  <li v-for="todo in todos">
    {{ todo }}
  </li>
</ul>
<p v-else>No todos left!</p>

8.e.target和e.currentTarget的区别

e.currentTarget指向事件所绑定的元素,而e.target始终指向事件发生时的元素。

		<div id="app" @click="button_click">
			<button>Hello</button>
		</div>

		<script>
			var vm = new Vue({
				el: '#app',
				data: {
					name: 'LX'
				},
				methods: {
					button_click(e) {
						alert('Hello ' + this.name + ' !')
						if(e) {
							alert(e.target.tagName)//事件发生时的dom对象
						}
						console.log('1.事件发生时的元素', e.target, '2.事件绑定的元素', e.currentTarget)
					}
				}
			})
		</script>

在这里插入图片描述

9.未完待续。。。

拓展——学习中碰到的函数:debounce(防抖动函数),indexOf,capitalize,prevent,splice

  1. 防抖函数 debounce 指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。假如我们设置了一个等待时间 3 秒的函数,在这 3 秒内如果遇到函数调用请求就重新计时 3 秒,直至新的 3 秒内没有函数调用请求,此时再执行函数,不然就以此类推重新计时。
    推荐博客:https://www.cnblogs.com/songyz/p/10310491.html(主要看后面的两张gif)
  2. indexOf函数可返回某个指定的字符串值在字符串中首次出现的位置。
  3. capitalize:
    (1)首字符会转换成大写,其余字符会转换成小写。
    (2)首字符如果是非字母,首字母不会转换成大写,会转换成小写。
str="hello WORLD";
str.capitalize()
'Hello world'

str="123 hello WORLD"
str.capitalize()
'123 hello world'

str="@ Hello WORLD"
str.capitalize()
'@ hello world'
  1. prevent和passive
    (1)prevent
    推荐一个博客,讲的很详细:https://blog.csdn.net/weixin_46683645/article/details/113104692
    (2)passive
    .passive 修饰符能够提升移动端的性能。
    每次事件产生,浏览器都会去查询一下是否有preventDefault阻止该次事件的默认动作。我们加上passive就是为了告诉浏览器,不用查询了,我们没用preventDefault阻止默认动作。
    注:passive和prevent冲突,不能同时绑定在一个监听器上。

  2. splice(替换函数)
    arrayObject.splice(index,howmany,item1,…,itemX)
    (1)index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
    (2)howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
    (3)0item1, …, itemX 可选。向数组添加的新项目。

  3. 未完待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值