vue从入门到精通day05

79 阅读6分钟

day05

1、todoList组件化开发(案例)

​ 静态页面 ​ 1、拆分页面 定义组件 ​ 2、将组件组装到App当中 ​ 3、渲染组件实现静态页面 ​ 动态页面 ​ 1、初始化动态显示页面 ​ 设计数据 todos = [ {id:1,content:'吃饭',isOver:false},{id:2,content:'睡觉',isOver:false}] ​ 数据展示 初始化todo内容展示和是否选中的展示 ​ 注意: 是否选中的打勾状态数据是根据todo的isOver计算而来的,需要computed去计算 ​

	2、交互(与用户的交互)
		2-1:完成鼠标移入移出删除按钮的出现和消失及背景色的改变 Item
			页面的变化其实对应的是数据的变化
		2-2: 完成添加todo逻辑 

		2-3: 点击每一项修改打勾(是否完成)操作   Item
		2-4:完成点击删除,删除某一项的操作 Item
		2-5:完成已完成和全部的数量展示 Footer    根据todos相关数据计算而来
		2-6:完成获取全选和全不选功能  全选和全不选功能checked的结果根据已完成和全部的数量计算得到



		2-7:点击设置全选和全不选,完成功能
		2-8:删除已完成功能




		2-9:刷新还是原来的效果,不会回到初始的情况(数据存储分析)
			保存什么数据   todos
			数据保存在哪   localStorage
			什么时候保存   数据只要发生改变就该存储 ===== 》 深度监视
			什么时候读取   初始化显示就该读取,在date中读取
			localStorage的简介(永久存储,关闭和刷新浏览器,数据不会丢失)
				localStorage是h5新增的一种本地存储数据方式,本质是一个对象
				setItem(key,value)
				getItem(key)  如果没有返回null
				removeItem(key) 
				clear()

		2-10:一般监视和深度监视
			一般监视:
				数组本身发生改变
				数组内部元素整体改变
			深度监视:
				数组本身发生改变
				数组内部元素整体改变
				数组内部元素内部数据改变

		2-11:深度监视数据,保存
			数据需要变为json然后取存储,否则数据下次取到的就看不懂了内部会调用对象的toString,数据变了
		
		2-12:在data数据中,直接从localStorage中获取数据

reduce() reduce()会比上面的几种方法复杂一些,reduce()接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。reduce()的语法如下所示。 array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

在reduce()中,第二个参数是可选的。如下代码所示。 var arr=[1,2,3]; var result= arr.reduce((a, b)=>a + b);//10 console.log(result);//6 运行代码后,控制台输出如图10-26所示。

图10-26 控制台输出

reduce()的callback可以接收四个参数。第一个参数为上一次调用回调返回的值或为初始值;第二个参数为正在执行的元素;第三个参数为数组中正在执行元素的索引;第四个参数为数组本身。如下所示。 var result1 = arr.reduce(function (total, currentValue, currentIndex, array) { console.log(total, currentValue, currentIndex, array); return total + currentValue; }); console.log(result1); 运行代码后,控制台输出如图10-27所示。

图10-27 控制台输出

从输出结果可以看到callback调用了2次,每次调用的参数和返回值,如下表6-1所示。 表 6-1 reduce调用参数 total currentValue currentIndex array return value 第一次调用 1 2 1 [1,2,3] 3 第二次调用 3 3 2 [1,2,3] 6

表6-1为callback接收四个参数但没有传入第二个参数的情况。那传入第二个参数又是什么样的呢?如下代码所示。 var arr = [1, 2, 3]; var result2 = arr.reduce(function (total, currentValue, currentIndex, array) { console.log(total, currentValue, currentIndex, array); return total + currentValue; }, 100); console.log(result2); 运行代码后,控制台输出如图10-28所示。

图10-28 控制台输出

这次运行后,可以发现callback调用了3次,每次调用的参数和返回值,如下表6-2所示。 表 6-2 reduce调用参数 total currentValue currentIndex array return value 第一次调用 100 1 0 [1,2,3] 101 第二次调用 101 2 1 [1,2,3] 103 第三次调用 103 3 2 [1,2,3] 106

当提供了第二个参数(initialValue)时,我们发现reduce()会从索引为0的currentValue开始执行callback;当不提供第二个参数(initialValue)时,reduce()会从索引为1的currentValue开始执行callback。也就是说当调用reduce()时,提供第二个参数(initialValue)时,total取值为initialValue,currentValue取数组中第一个值;不提供第二个参数,total取数组中第一个值,currentValue取数组中第二个值。

2、 组件化编码的基本规范

子组件里面不要去更新父组件当中的数据
1、分析数据在哪个组件
2、数据在哪个组件,那么更新数据的行为(方法)就在哪个组件
3、父组件的数据传递给子组件,是用来让子组件读取显示使用的,而不是让子组件去修改的(可以但是不该)
4、子组件需要更新数据,那么需要调用父组件传递过来的更新数据方法

props三种写法: 通信的时候,只能是父子之间

第一种接收属性写法
props: ['index']
第二种接收属性写法
props:{
	index:Number
}
第三种接收属性写法
props:{

	index:{
		type:Number,
		default:0
	}
}

自定义事件组件间通信深入理解: 和props父给子传递函数数据的时候类似

自定义事件:

	    自己定义的事件:事件类型(自己定义无数个)和回调函数(自己定义自己触发,默认传参是自己传就有,不传就是undefined)

	    系统定义的事件:事件类型(固定几个)和回调函数(自己定义系统触发 默认参数是事件对象)



适用:专门子向父通信

​ 做法:在父组件当中可以看到子组件对象,给子组件对象绑定自定义事件$on 回调函数的定义在父组件中

      在子组件当中,我们需要传递数据的地方,去触发自己身上的事件$emit,调用回调函数中传参给父

为什么父不能通过自定义事件给子传递数据


原因:因为父组件内部可以看到子组件对象,可以给子组件对象绑定事件,回调函数在父组件定义
      而子组件内部看不到父组件对象,没法给父组件对象绑定事件,子组件没法定义回调函数,但是可以看到自己身上的事件,
	可以触发

​ ​

接受数据的组件必须能看到预绑定事件的组件对象,才能绑定
发送数据的组件必须能看到绑定了事件的组件对象,才能触发事件


$on
$emit


$off   //解绑事件
$once  //绑定只能触发一次的事件


vm和组件对象的关系

	vm实例化对象的原型是组件对象原型的原型
	$on  $emit 等方法是在vm的隐式原型身上的(Vue的显式原型身上)

全局事件总线组件间通信 适用于任意组件间传递 必须理解必须搞定 创建一个中间人,让所有的组件都可以看到这个人,并且这个人可以使用onon和emit (vm添加到Vue原型当中作为总线) 在想要接受数据的组件内 找中间人去绑定事件 在想要发送数据的组件内 触发中间人绑定的事件