Vue(day2)

第二天

TODOMVC

一 : 准备工作

  1. vue-TodoMVC
  2. 演示效果 :

    当前任务:敲代码、视频、游戏

  3. 下载模板地址

    git clone https://github.com/tastejs/todomvc-app-template.git

  4. 安装依赖包 : npm i

二 : 配置 vue

  1. 安装 vue : npm i vue
  2. 导入 vue : <script src="./node_modules//vue/dist/vue.js"></script>

    index.html里的app.js 导入之前导入,因为 app.js 里 就要用到 vue 了

  3. 实例化 vue :在app.js中创建 vue 示例,并设置好边界 el:'#app'

    找到 index.html ,给 section 标签添加一个 id

  4. 测试 vue :

    data 中随便来一个 msg 看能不能显示到视图中

三: 列表渲染

  1. todoList 数组里面都是对象 id name done

    id : (唯一标识 ) 删除需要
    name : (名称) 展示需要
    done : (是否完成任务) 选中状态需要

  2. 去掉线 : :class="{ completed : item.done }"
  3. 多选框选中状态 : v-model='item.done'

四 : 添加任务

	/**
			 * 添加任务
			 */
			addTodo( e ) {
				console.log('添加任务',this.todoName);

				// 0. 判断不能为空
				if (this.todoName.trim() === '') {
					return;
				}

				// 1. 添加任务
				if (e.keyCode === 13) {
					this.todoList.push({
						id : 4,
						name : this.todoName,
						done:false
					})
					//2. 清空文本框内容
					this.todoName = ''
				}

			}

五 : 删除任务

传 id,过滤不是 id 的

this.todoList = this.todoList.filter(item => item.id != id)

六 : 编辑任务 (难点)

画图

三步 :

  1. data 中存一个数据 : editId, 记录选中的文本框
  2. :class = {editing: item.id === editId } 判断 选中的是哪一个,是选一个都返回true, 显示编辑状态
  3. 双击 : @dblclick="editTodo(item.id)"
  4. 在editTodo 函数里 保存选中的id this.editId = id
  5. 回车 : 编辑状态消除 : this.editId = -1
  6. Vue中数据更新的特点
    只要Vue中的数据发生改变,页面中所有的指令和表达式都会被重新计算一次

七 : 按键修饰符

记住 keyCode 太麻烦了

  1. 只有在键盘事件中生活效, (keydown keypress keyup)
  2. 语法 : @keyup.enter='事件函数'
    .enter 就是一个按键修饰符,意思就是当按回车的时候,事件才会被触发
  3. @keyup.13 也可以,但是 keyCode 也是要记住的
  4. 完善 TodoMVC + 按键修饰符

八 : v-if 和 v-show

  1. 代码

  2. <h1 v-if='isShow'>我是h1 v-if</h1>
    
    <h1 v-show='isShow'>我是h1 v-show</h1>
    
  3. 异同点

  4. v-if 和 v-show 的异同点
    
    1. 相同点 : 可以切换元素的显示与隐藏
    
    2. 不同点 : 切换显示和隐藏的实现不同
    
        v-if :  显示:创建节点  隐藏: 删除节点
    
        v-show : 显示: display:block  隐藏 : display:none
    
    3. 使用场景 :
    
        v-if因为要不断的创建和删除来切换显示与隐藏 ,所以性能不高
    
        v-if : 切换次数不频繁的时候,
    
            v-show : 切换次数频繁的时候
    
    
  5. 完善 TodoMVC + v-show

  1. 直接写
    v-show="todoList.length > 0"

  2. 封装到一个函数里

  3. 组件 : v-show="isFooter()"

  4. // 代码显示
    isFooterShow() {
    
    			// 只要 vue里的数据发生了变化, 页面中所有的指令和表达式都会重新计算
    
    			// 所以只要文本框里的内容发生改变,.todoName也会发送改变,这里就会不断的打印,,性能不好
    
    			console.log('改变了');
    	return this.todoList.length > 0
    }
    
  5. 有问题

    3.1 只要 vue 里data的数据发生了变化, 页面中所有的指令和表达式都会重新计算
    3.2 所以只要文本框里的内容发生改变,.todoName 也会发送改变,这里就会不断的打印,,性能不好
    3.3 我们要做的是 只要数组列表的个数改变才会影响底部的变化, 文本不管内容文字再多都不应该影响底部的变化
    3.4 下面需要 计算属性

十 : 计算属性 computed

计算属性其实就是一个属性

  • 说明 : 计算属性只跟随相关的数据变化而变化 ,解决底部显示隐藏问题,

  • 怎么使用?

    • 在 computed 里面
    • 写起来像一个方法
    • 用起来像一个属性
  • 特点 :

    • 计算属性一定要有返回值, 返回的值,就会标签要展示的内容

    • 计算属性可以使用data里之前已知的值

    • (重要) 只要 计算属性 相关的数据 发生了变化,计算属性会 重新计算

    • (说一下 😃 num1就是totalNum计算属性的相关属性,所以num1变了,计算属性会重新计算,

      ​ 但是num2不是相关的属性,所以不管你num2怎么变,计算属性都不会重新计算

  • 注意点 :

    • 4.1. 一定要有返回值
    • 4.2. 用起来的时候,不能当方法用,因为它本来就是一个属性
    • 4.3. 计算属性(computed里面的属性) 不能和 data里的属性重名
  • 什么时候使用 计算属性?

  • 根据已知的值,得到一个新值

  • 并且 , 新值只想跟相关的数据(已知的值)的变化而变化 (实时更新)

  • 案例 : 计算器

num1 <input type="text" v-model="num1" /> + 
num2 <input type="text" v-model="num2" /> = <span>{{ num3 }}</span>
      <hr />
<input type="text" v-model="test" />
  • 完善 TodoMVC + 计算属性 + 底部显示与隐藏 / 左边的剩余未完成数 / 右边清除完成按钮显示与隐藏

十一 : key

  • 说明 :
    • Vue 中推荐, 在使用 v-for 的时候,添加 key 属性

看官网

  • 介绍 就地复用
<!-- 显示组件 -->
<p v-for="(item,index) in list" :key="index">
	{{ item.name}} <input type="text" />
</p>
<!-- 数据 -->
data: { list : [ 
            { id : 1, name : '老罗' },
            { id : 2, name : '涛涛' }, 
            { id : 3, name : '聪聪' } 
			]}

<!-- 演示  -->
vm.list.unshift({id:4,name:'马哥'})
  • 怎么使用 key
    • 如果数组的元素是一个对象 : 使用对象里固定属性,唯一
    • 一般情况下,对象里都有 id, 99%都是取 item.id
    • 如果数组的元素是一个简单类型,不是一个对象, 就可以取索引作为 key
    • 语法 : :key='item.id'
    • 以后,写了v-for之后,立马写好 :key
  • 完善 TodoMVC + key

十二 : 其他指令 v-else-if 和 v-else

  1. v-else : 两种情况的
<h1 v-if="num > 40">第一个</h1>
<h1 v-else>第三个</h1>
  1. v-else-if : 三种以上情况
<h1 v-if="num >= 40">第一个</h1>
<h1 v-else-if="num >= 30 && num < 40">第二个</h1>
<h1 v-else>第三个</h1>
posted @ 2020-04-19 22:58  handsomehe  阅读(194)  评论(0编辑  收藏  举报