vue-bilibili学习笔记



1.vue基础

VUE调试工具

vue调试工具步骤:   
	1.远程克隆仓库
  2.安装依赖包
  3.构建
  4.打开谷歌页面
  5.选中开发者模式
  6.加载已解压的扩展,选择shells/chrome

1.组件间数据及交互

数据交互原则: 单向数据流

父组件的数据传递给子组件, 只要父组件的数据变化了,自动重新向下流动, 进而子组件会进行更新数据
所以父组件的数据应该交给父组件修改
数据来源
			data: 自己的数据可以随便更改
			props: 传进来的数据不允许更改, 或者不建议更改 : 防止多个子组件进行数据交错
父传子传递复杂数据类型的说明

​ 修改简单数据类型会报错

​ 修改复杂数据类型,修改地址报错, 如果不改地址,修改对象的属性,不会报错,但是不符合单项数据流

​ 通过 e v e n t 设 置 event设置 event 事件对象 进行设置

  •   如果是简单数据类型,  子组件修改了,vue能检测到
      如果是复杂数据类型, 子组件修改父组件出过来的值,不会报错 ,
    

    解决办法 : 表单双向数据绑定

    解决办法一 :
    
                不能用v-model进行与数据绑定 
                用 : checked = 'item.flag' 进行数据绑定  
                通过事件对象$event 事件对象 进行传递, 同时在函数中   function (e){e.target.checked}
                同伙
    
    解决办法二  : 
    						将父组件接收过来的数据通过json.parse(json.stringify(arr))转成一个新的数组或者对象 
    

1.父传子

​ 组件内部通过props接收传递过来的值

Vue.component('el-header', {
     
   props: ['title'],  
   template: '
{ {title}}
'

​ 父组件通过属性将值传递给子组件

<el-header title='来自父组件中的数据'></el-header>  //传递静态数值,一般不用 
<el-header :title='title'></el-header>            //传递变量 动态绑定属性值
1.可以进行传递多个值.
2.如果么有进行传值, 而子组件使用这个数值, 会出现undefined

​ 命名规则

在prop中使用驼峰形式,在模板中需要使用短横线形式 , 字符串形式的模板没有限制,可以使用个驼峰形式

​ 传值规则: 不加 : 传递的是string类型数据, 加冒号是正常数据

如果传递number数据类型, 传递的都是字符串
	:title='12'  //number   	区分类型
	title='12'    //string    不区分类型        

注意: 父子组件传值, 数据是异步请求, 有可能数据渲染时, 报错 v-if=isReady

	原因:   异步请求时, 数据还没有获取到, 但是此处已经渲染到节点了
	解决方案:   在父组件需要传递数据的节点加上   v-if=isReady (isReady)默认为false, 异步请求获取数据后,isready赋值为true

2.子传父:

​ 子组件向父组件传递的值不是双向绑定的

​ 目的:通过子组件触发事件影响父组件中的数据 或者父组件传递过来的数据,比如通过子组件中的按钮点击放大父组件整个盒子的背景色


  • 父组件监听子组件事件

    ​ 本质是监听子组件触发的事件, 同时父组件根据这个事件进行触发相应的函数,这样避免了子组件直接操作父组件传递的数据

    尽管数据vue允许子组件去修改父组件数据, 但是在业务中,子组件应该尽量避免依赖父组件中的数据, 更不应该去主动修改他的数据, 以为这样使得父子组件紧耦合, 只看父组件, 很难理解父组件的状态, 因为他可能被任意组件修改,   
    理想情况:     
    			只有组件自己能修改他的状态, 父子组件最好还是通过props 和$emit来进行通讯
    

    $emit(自定义事件名, 值) 子组件想父组件传递值 ,//好像只能传递一个值, 如果想要传递多个值, 可以用数组或则对象的方式进行传递 ,事件名全部小写

    this.$$emit​(事件名, 参数1, 参数2,参数3……) //函数里面写

    $event 接收子组件传递的值

    模板中传值  : 
    
    子组件设置 @click='$emit(enlarge-text')
    页面中设置 
    父组件定义change函数 
    
    方法值设置$emit
    
    
    
    
    子组件通过自定义事件进行传值        
    <button v-on:click="$emit('enlarge-text', 0.1)">  //这是直接写在模板里面
      Enlarge text    
    </button>
    父组件通过设置$event接收参数
    页面中设置 <son-slot @enlarge='change($event)'>   //通过在事件里面写$event进行值的获取   方法里面注意后面的$event不写
    函数种设置 change:function(value1, value2, value3 , value4....){
           } value就是$event的形参
    
案例   : 父组件定义这个事件的时候, 可以是函数方法  changeFont   也可以是  data中的数据  fontSize
      <!-- <el-header :msg="msg" @enlarge="changeFont"></el-header> -->    方法都是用v-on 或者是  @ 
      <el-header :msg="msg" v-on:enlarge="fontSize += $event"></el-header>

3.非父子

  • 单独的事件中心管理组件间的通信

    单独的创建一个vue事件对象
    var   evetnhub = new Vue()    
     触发事件  进行参数传递   methods              
    evetnhub.$emit('子组件事件名称', 传参1)  //触发兄第组件事件 ,向事件中心传递信息 
    监听事件与销毁事件   事件的监听写在mounted函数里面  
    evetnhtb.$on('子组件事件名称', (接收参数1)=> {
           })  //监听事件事件中心中的变化 执行相关函数, this指向当前vue实例 本子组件
    event.$off('add-todo')
    

事件注册点击相关

点击子组件click  触发senddata函数,  函数里面有emit,触发emit的change-state事件,  同时页面父元素上有change-state事件  该事件的执行函数为  fn1       

3.案例 :todos

单项数据流  
删除功能  :     
								父组件根据id值进行删除list数据 ,父组件注册事件接收参数
增加功能  :   用v-model进行双向数据绑定, 注册键盘回车事件  
修改状态  :   v-model双向数据绑定,但是并没有遵循单项数据流

数据持久化 : 如果是axios版本发送ajax不需要进行数据持久化

watch : {
		list: {
				deep: true;
				handler(newValue) {
						localStroage.setItem('todos-data' , json.stringify((newvalue))) 
				}
		}

数据获取 :

created: function (){}

2.组件插槽

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YEBtxbke-1604141484224)(C:\Users\22359\AppData\Roaming\Typora\typora-user-images\1600936632623.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lGVbZMqV-1604141484231)(C:\Users\22359\AppData\Roaming\Typora\typora-user-images\image-20200925175147455.png)]

1.语法:

在子组件标签之间传递内容

​ 里面的请输入正确的手机号码 , 请输入用户名, 不是写死的, 用插槽

为甚要用插槽 :

​ 通过父传子, 自定义型较差, 通过插槽可以进行自由定制内容

作用:

​ 用于实现组件的内容分发 ,自由定制任意结构, 用slot标签进行接收内容

  • 在vue中,在子组件标签里面填写内容是不显示的, 这样需要用到插槽的方式进行传递
  • slot标签确定传递内容的位置
  • 如果slot中有默认内容,会被默认显示,如果父组件没有传递内容,slot中的内容会被覆盖
错误提示
//   组件插槽
      Vue.component('el-header', {    
        template: `
            
error:
`, })

2.具名插槽: 有名字的插槽

  • template: 向子组件中传递多个标签, template并不会渲染到页面

  • 一般插槽

    里面可以包裹多个标签

  • 插槽默认 { {msg}} 直接值slot使用

    注意:

    ​ vue-2.6版本中, v-slot指令取代了slot 与slot-scope,但是v-slot使用时, 需要在template标签上使用,不能在普通标签上使用

    ​ template通过v-slot指令绑定插槽, v-slot:header, header不加引号 不是等于号进行绑定数据

    ​ slot=‘header’ 是通过属性进行绑定 . 所以是=号, 不是 :

向子组件传递自定义标签名的插槽 ,通过name属性绑定,即将标签换成插槽传递给子组件

标签中传递的内容根据传递的slot属性进行传递, 子组件根据name进行匹配,没有匹配到的根据作为默认插槽使用
只能标注一个标签, 如果需要多个标签的话, 用template包裹,template并不会渲染到页面
<el-header>
        <p>默认信息</p>
        <p slot="header">这是title信息</p>
        <p slot="footer">这是footer信息</p>
</el-header>
 template: `      
            
//默认插槽
`
, })

3.作用域插槽

​ 如果子组件中有数据, 希望在父模板分发内容是使用, 可以使用作用域插槽

​ 给插槽添加属性的方式, 给父模板传值,

  • 给插槽,添加属性的方式传值

  • 所有添加的属性 , 都会被收集到一个对象中, {yes:’确认’., no; ‘ 取消’, moneny : 100}

  • 在template中, 通过=即可接受子组件传递过来的数据,这样可以操作子组件传递过来的数据

  • 如果子组件向模板传递过来的数据命名和vue实例中的数据名相同, 在模板中, 会使用子组件的数据

  • 模板的范围属于谁,使用的就是谁的变量 比如子组件里面的模板, 其实模板使用的变量是不是组件的, 而是vue实例

    所以插槽里面如果有点击事件的方法写在vue实例里面, 而不是写在子组件里面

    作用域插槽使用场景

    表格模板中,delelte操作时不固定的, 也可能是add,所以需要设置template进行自定义,防止把子组件写死

    但是点击delete或者add时,需要发送id,进行ajax操作,所以子组件向插槽传值

    注意:template 插槽的名称不要重复,否则下面的插槽会覆盖上面的插槽,

    插槽里面如果需要操作数据,添加方法,需要将插槽写在tmeplate所在位置, 而不是插入的子组件mo模板的范围属于谁,用的就是谁的变量

    
    
      
        
        
        
        Document
        
      
      
        
     父组件传递的插槽 通过=号解释   
     
    子组件模板传递的数据   直接在slot进行传递数据  
      
    

    4.插槽规则

    插槽的几种形式 v-slot只能在template中写

                    有标签的插槽