• Vue 夫向子传递 子向父 平辈传递 ref属性 is属性 vue使用swiper轮播图 插槽


    1-父组件向子组件通信

    1.1-步骤

    自定属性的方式实现数据传递

    1. 父组件中:

      在子组件的调用标签上, 通过v-bind动态设置一个自定义属性,将父组件中需要传递的数据赋值给自定义属性

       <!-- 父向子: 第一步 -->
      <List v-bind:dataList="list"/>
      
    2. 子组件中:

      在子组件的配置对象中通过props属性节点来接收父组件通过自定义属性传递过来的数据

      export default {
          //  父向子: 第二步(数组元素需要和自定义属性的名称保持一致)
          props:['dataList'],   
          data(){
              return {
                  // 控制添加模态框的显示状态
                  isAdd:false
              }
          },
          methods:{
          }
      };
      

    1.2-对props数据的类型进行校验

    • 数据类型可选值: String/Number/Boolean/Undefined/Null/Array/Object
    1. 写法1

      export default {
        // 实现对props数据进行类型校验  
        props: {
            isAdd:Boolean
        }
      }
      
    2. 写法2

      export default {
        props: {
          // 数据类型:[默认值]
          msg: [String, Number]
        }
      }
      
    3. 写法3

      export default {
        props: {
          dataList: {
            // 数据类型  
            type: Array,
            // 如果是对象或者数组, 建议使用函数的方式返回默认值
            default() {
              return [
                {
                  id: 4,
                  title: "新添加",
                  content: "新添加内容"
                }
              ];
            }
          },
          msg:{
            // 数据类型
            type:String,
            // 默认值
            default:'你好'
          }
        }
      }
      

    1.3-props数据和data数据的区别

    • props数据
      1. props来自外部的数据
      2. 如果props数据类型是基本数据类型(String,Number,Boolean), 那么不能重写
      3. 如果props数据类型是引用数据类型(Array,Object), 那么可以重写
    • data数据
      1. data数据是组件内部的数据
      2. data数据可读可写

    1.4-注意事项

    ​ 1. props数据的名字不要和data同名

    2-子组件向父组件通信

    • 通过自定义事件的方式实现子组件向父组件传递数据

    2.1-步骤

    1. 父组件中:

      在子组件的调用标签上通过v-on绑定一个自定义事件, 然后在父组件中的methods中定义一个方法, 充当自定义事件的处理函数

      <!-- 注册自定义事件 -->
      <List v-bind:dataList="list" :msg="'hello'"  @del="del"/>
      
      del(id){
          // console.log(id,'index.vue');
          // 1-通过id查找索引
          const index=this.list.findIndex(item=>item.id===id);
          //  通过splice方法删除数据元素
          this.list.splice(index,1);
      }
      
    2. 在子组件中:

      通过this.$emit('自定义事件的名称','需要传递数据')触发自定义事件

      // 删除按钮的点击事件处理函数
      del(id){
          // 2-触发自定义事件, 并且传递数据
          this.$emit('del',id);
      }
      

    3-非父子组件之间通信

    • 通过自定义事件实现非父子组件的数据通信

    实现步骤

    1. 创建一个空的vue实例对象vm , 充当事件中心的角色

      /utils/vm.js

      // 1-导入vue
      import Vue from 'vue';
      // 创建一个空的vue实例, 充当事件中心的角色
      export default new Vue();
      
    2. 在A组件中通过事件中心vm.$emit()触发自定义事件

      /pages/list.vue

      // 编辑按钮的事件处理函数
      edit(row){
          // 显示alert组件
          this.$emit('updateIsAdd',true);  
          // 1-通过自定义事件传递待编辑的数据
          vm.$emit('contentUpdate',row); 
      }
      
    3. 在B组件中通过事件中心vm.$on()监听自定义事件的执行

      /pages/alert.vue

      created(){
          // 2-监听自定义事件
          // vm.$on('自定义事件名称',事件处理函数);
          vm.$on('contentUpdate',(obj)=>{
            // 更新表单数据模型
            this.formData=obj;
          })
        }
      

    4-ref属性

    • 虚拟DOM: 特殊的对象

      const h1={
          name:'h1',
          attributes:{
              title:'属性值',
              style:{
                  color:'red'
              },
              className:'.container'
          },
          children:[
              'h1的内容'
          ]
      }
      
      const div={
          name:'div',
          attributes:{
              title:'属性值',
              style:{
                  color:'red',
                  fontSize:'20px'
              },
              className:'.container'
          },
          children:[
              '文本内容',
              h1
          ]
      }
      
    • 作用: 帮我们间接操作标签对象或者组件对象

    4.1-ref属性操作标签

    1. 在目标元素(标签/组件)添加一个ref属性, ref属性的值必须保证唯一不重复

       <h1 ref="h1">{{msg}}</h1>
      
    2. 在逻辑层通过this.$refs.ref属性名获取标签的虚拟dom对象或者组件对象

      this.$refs.h1.style.color='red';
      this.$refs.h1.style.border='1px solid red';
      this.$refs.h1.style.backgroundColor='yellow';
      

    4.2-ref属性操作组件

    1. 在组件调用标签上添加一个ref属性, 保证ref属性值的唯一性

      <Box1 ref="box1"/>
      
    2. 在逻辑层通过this.$refs.ref属性名获取组件对象

      // 组件对象
      console.log(this.$refs.box1);
      // 获取组件内部的数据
      console.log(this.$refs.box1.msg);
      // 调用组件内部的方法
      this.$refs.box1.setMsg('更新过的msg');
      // 修改组件的视图(操作组件视图的虚拟dom必须通过$el属性)
      this.$refs.box1.$el.style.backgroundColor='green';
      

    5-is属性

    • 作用: 接收组件名称
    • 使用范围
      • component动态组件
      • 普通html标签

    6-vue项目中引入jquery

    6.1-下载安装

    npm i jquery -S
    

    6.2-使用

    import $ from 'jquery'
    

    7-vue中使用swiper轮播图插件

    7.1-下载安装

    npm i swiper@3.4.2 -S
    

    7.2-使用

    1. 导入swiper核心js

      import Swiper from 'swiper'
      
    2. 导入样式文件

      import 'dist/css/swiper.min.css'
      
    3. 初始化

       <div class="swiper-container">
           <div class="swiper-wrapper">
               <div class="swiper-slide">Slide 1</div>
               <div class="swiper-slide">Slide 2</div>
               <div class="swiper-slide">Slide 3</div>
           </div>
           <!-- 如果需要分页器 -->
          <div class="swiper-pagination"></div>
      
          <!-- 如果需要导航按钮 -->
          <div class="swiper-button-prev"></div>
          <div class="swiper-button-next"></div>
      </div>
      
      // 初始化
      var swiper = new Swiper('.swiper-container', {
          pagination: '.swiper-pagination',
          paginationClickable: true,
          lopp:true,
          autoplay:1000
      });
      
      .swiper-container {
           100%;
          height: 100%;
      }
      

    8-插槽

    • 插槽也是外部向组件内部传递数据的一种方式
    • 传递的是标签结构
    • 通过组件调用标签之间

    8.1-匿名插槽

    8.1.1-定义

    <template>
      <div class="cmt-container">
          <h3>评论</h3>
          <hr>
          <!-- 占位 -->
          <slot></slot>  
      </div>
    </template>
    
    <script>
    export default {}
    </script>
    <style scoped>
    .cmt-container{
         600px;
        height: 200px;
        margin:40px auto;
        line-height: 50px;
        padding:10px;
        background: lightyellow;
    }
    </style>
    

    8.1.2-调用

     <Comment>
         <input type="text" placeholder="请输入评论内容" />
         <hr />
         <button>立即提交</button>
    </Comment>
    
    <hr />
    
    <Comment>
        <div>
            <textarea placeholder="请输入评论内容" cols="30" rows="3"></textarea>
            <hr />
            <button>立即提交</button>
            <button>清空</button>
        </div>
    </Comment>
    

    8.2-具名插槽

    8.2.1-定义

    • slot: 充当占位符
    <template>
      <div class="panel-container">
          <!-- 具名插槽 -->
          <slot name="header"></slot> 
          <div>
              <input type="text" placeholder="用户名"/>
          </div>
          <div>
              <input type="text" placeholder="密码"/>
          </div>
          <slot name="footer"></slot>  
      </div>
    </template>
    <script>
    export default {}
    </script>
    <style>
    .panel-container{
         600px;
        height: 140px;
        margin:60px auto;
        background: lightyellow;
        padding:10px;
        line-height: 30px;
    }
    </style>
    

    8.2.2-调用

    • slot: 充当占位符
    <Panel>
        <div slot="header">
            <h3>登录页面</h3>
        </div>
        <div slot="footer">
            <button>立即登录</button>
            <button>重置表单</button>
        </div>
    </Panel>
    

    8.3-作用域插槽

    8.3.1-定义

    • slot插槽组件的2个作用:
      • 1-占位符
      • 2-分发数据
    <template>
      <div class="list-container">
          <ul>
              <li v-for="item in list" :key="item.id">
                  <!-- 
    					slot插槽组件的2个作用: 1-占位 2-分发数据 
                   -->
                  <slot :row="item"></slot>
              </li>
          </ul>
      </div>
    </template>
    
    <script>
    export default {
        data(){
            return {
                list:[
                    {
                        id:3,
                        name:'vue'
                    },
                    {
                        id:2,
                        name:'react'
                    },
                    {
                        id:1,
                        name:'angular'
                    }
                ]
            }
        }
    }
    </script>
    
    <style>
    .list-container{
         400px;
        height: 200px;
        margin:20px auto;
        background: #EEE;
        
    }
    .list-container li{
        list-style: none;
        padding:10px;
        line-height: 30px;
        border-bottom:1px dashed #999;
    }
    .list-container li label{
        cursor: pointer
    }
    </style>
    

    8.3.2-调用

    • 老写法: slot-scope

       <List>
           <!--props为模板变量, 名字自己定义, 保存的是slot插槽组件上的自定义属性-->
           <!-- slot组件上的属性集合 -->
           <!-- slot-scope:老的写法 -->
           <template slot-scope="props">
               <label>
                   <input type="checkbox" />
                   &nbsp;{{props.row.id}}---{{props.row.name}}
               </label>
           </template>
      </List>
      
    • 新写法: v-slot

      <List>
          <!-- v-slot: 最新写法 -->
          <template v-slot="obj">
              <label>
                  <input type="radio" name="lang"/>
                  &nbsp;{{obj.row.id}}---{{obj.row.name}}
              </label>
          </template>
      </List>
      

    9-组件样式添加作用域

    • 在组件内的style标签之上添加一个scoped属性, 即可实现让组件内的选择器只对当前组件的视图生效, 而不会影响到其他组件
    <style scoped>
    
    </style>
    

    组件内样式添加作用域的原理

    1. vue会生成一个随机的字符串, 如data-v-02e4c64b
    2. style标签内的选择器改写为交集选择器,如.container[data-v-02e4c64b]
    3. 在调用选择器的标签上添加随机属性<div class="container" data-v-02e4c64b></div>
  • 相关阅读:
    Oracle 查看一个表对应的主键和外键的约束关系,查看的语句:
    openssl 生成p12文件错误
    XP SP3远程桌面无法连接Windows Server 2008/Vista
    windows 7 正确禁用 IPv6
    用正则表达式替换换行符
    Eclipse插件开发之定制向导(各方法说明)
    oepnvpn 配置自启动
    TNS12547: TNS:lost contact 错误解决
    redhat 5.5 U盘安装
    Hibernat 使用Criteria查询多对多关系(SET集合)条件
  • 原文地址:https://www.cnblogs.com/bnzw/p/14015872.html
Copyright © 2020-2023  润新知