vue2-组件相关

118 阅读2分钟

组件

每个组件实例,都是一个独立的对象,对象中绑定有的数据,每个组件的数据必须是不同地址的数据

父组件向子组件传值

需要通过属性的形式,父组件向子组件传值

<MyDemo> 属性名="属性值"</MyDemo>

如果属性名没有通过v-bind进行动态绑定,那么属性值不管写什么内容都是字符串类型。

使用v-bind 绑定之后,属性值区域变成了表达式

<MyDemo> v-bind:属性名="表达式"</MyDemo>

如果要传的数据是一个数组,数组里面包含对象。例如

data() {
    return {
        list: [
            {
                id: 1,
                title: 'aaa',
                user: 'zs'
            }
        ]
    }
}

那么在向子组件传值的时候,就可以采用v-for进行遍历传值

<MyDemo v-for="item in list" :key="item.id" :user="item.user" 
  :title="item.title"></MyDemo>

简写

<MyDemo v-for="item in list" :key="item.id" v-bind="item"></MyDemo>

子组件接收父组件传递过来的数据

子组件需要在js 中设置props属性。props属性的三类写法:

第一类,props的值是数组。

props: [属性1, 属性2 ...]

第二类:props的值是一个对象,属性值同样是一个数组或构造函数。

props: {
    属性名: 构造函数, // String, Number ...
    属性名: [构造函数], // [String, Number...]
}

第三类,props的值是对象,属性值同样是对象,对象当中包括常用的三个属性。

props: {
    属性名: {
        type: 类型,
        default: 默认值, // 父组件并没有给子组件传递数据的时候,默认值生效
        required: 必填项 // 如果设置了这个属性,那么父组件就必须传递数据,同时这个属性和default 是互斥的
    }
}

在第三轮的使用方法中,我们还可以使用validator函数来进行自定义的校验

props: {
    属性名: {
        // val表示的父组件传递到子组件的属性值
        validator(val) {
            // 进行校验...
            return // return的结果如果为true,则表示属性值通过校验,vue不会报错。如果返回值为false,则表示属性值没有通过校验,vue就会报错
		}
    }
}

<template>
  <div>
    <h3>总人数:{{ data.length }}</h3>
    <ul>
      <li v-for="item in data" :key="item.id">
        姓名: {{ item.name }}; 年纪: {{ item.age }}
      </li>
    </ul>
    <p>{{ car }}</p>
    <p>{{ money }}</p>
    <p>{{ age }}</p>
    <p>{{ title }}</p>
  </div>
</template>

<script>
export default {
  // 利用工厂函数提供数据,保证每次提供的数据,都是最新创建的,一个组件使用多次互不影响
  data() {
    return {}
  },
  props: {
    // 1. 基础的类型检查 Number String Boolean Object Array Function ...
    data: Array,
    car: String,
    money: Number,
    flag: Boolean,

    // 2. 多个可能的类型
    params: [String, Number, Boolean],

    // 3. 必填项 (要求用户必须传,如果不传,就报错)
    age: {
      type: Number,
      required: true
    },

    // 4. 默认值 (用户可传可不传,如果不传,使用默认值)
    title: {
      type: String,
      default: '大标题' 
    },
    // 默认值补充,如果是复杂类型,比如对象,比如数组,比较特殊,
    // 默认值需要通过函数返回值提供 (不用记,写错了会报错的)
    arr: {
      type: Array,
      // 目的:通过函数提供的函数,每次生成一个新的组件,默认值[] 都是新生成的,多个组件实例不影响
      default () {
        return []
      }
    },
    obj: {
      type: Object,
      default () {
        return {}
      }
    },

    // 5. 自定义验证函数 color 可选值 red yello green (可以解决一切需求,想怎么校验就怎么校验!更灵活)
    color: {
      validator (value) {
        // return true 通过校验
        // return false 没通过校验
        // 内部逻辑,自行判断提供
        // if (value === 'red' || value === 'yellow' || value === 'green') {
        //   return true
        // } else {
        //   return false // 没通过校验
        // }

        // arr.includes(值) => 判断数组是否包含某个值,如果包含,返回true,不包含,返回false
        const validArr = ['red', 'yellow', 'green', 'blue', 'orange']
        return validArr.includes(value)
      }
    }
  }
}
</script>

<style>

</style>

子组件向父组件抛出自定义事件

子组件想要向父组件抛出自定义事件,需要通过$emit方法来实现。

this.$emil(事件名,参数...)

子组件抛出自定义事件之后,父组件就可以在使用子组件的时候,进行时间的监听。

<MyDemo @事件名="事件处理函数"></MyDemo>

单向数据流

在vue中需要遵循单向数据流原则:(从父到子的单向数据流动,叫单向数据流) 1,父组件数据变化了,会自动向下流动影响到子组件 2.子组件不再直接修改父组件传递过来的props,props是只读的