Vue 关于组件(一)

作者: samtake | 来源:发表于2019-05-04 21:29 被阅读5次

在Vue中,组件:小型的,一个个独立,可以复用的UI模块。它有三大概念:属性、事件、插槽

属性

  • 自定义属性props
    • 组件props中声明的属性
  • 原生属性attrs
    • 没有生命的属性,默认自动挂载到组件根元素上
    • 设置inheritAttrs 为false可以关闭自动挂载
  • 特殊属性 class、style
    • 挂载到组件根元素上
    • 支持字符串、对象、数组等多种语法
<template>
  <div>
    name: {{ name }}
    <br />
    type: {{ type }}
    <br />
    list: {{ list }}
    <br />
    isVisible: {{ isVisible }}
    <br />
    <button @click="handleClick">change type</button>
  </div>
</template>

<script>
export default {
  name: "PropsDemo",
  // inheritAttrs: false,
  // props: ['name', 'type', 'list', 'isVisible'],
  props: {
    name: String,
    type: {
      validator: function(value) {
        // 这个值必须匹配下列字符串中的一个
        return ["success", "warning", "danger"].includes(value);
      }
    },
    list: {
      type: Array,
      // 对象或数组默认值必须从一个工厂函数获取
      default: () => []
    },
    isVisible: {
      type: Boolean,
      default: false
    },
    onChange: {
      type: Function,
      default: () => {}
    }
  },
  methods: {
    handleClick() {
      // 不要这么做、不要这么做、不要这么做
      // this.type = "warning";
      // 可以,还可以更好
      this.onChange(this.type === "success" ? "warning" : "success");
    }
  }
};
</script>

事件

  • 普通时间

    • @click,@input,@change,@xxx等事件
    • 通过this.$emit('xxx',...)触发
  • 修饰符事件

    • @input.trim,@click.stop,@submit.prevent 等
    • 一般用于原生html元素,自定义组件需要自行开发支持
<template>
  <div>
    name: {{ name || "--" }}
    <br />
    <input :value="name" @change="handleChange" />
    <br />
    <br />
    <div @click="handleDivClick">
      <button @click="handleClick">重置成功</button>&nbsp;&nbsp;&nbsp;
      <button @click.stop="handleClick">重置失败</button>
    </div>
  </div>
</template>

<script>
export default {
  name: "EventDemo",
  props: {
    name: String
  },
  methods: {
    handleChange(e) {
      this.$emit("change", e.target.value);
    },
    handleDivClick() {
      this.$emit("change", "");
    },
    handleClick(e) {
      // 都会失败
      //e.stopPropagation();
    }
  }
};
</script>

插槽

  • 普通插槽
    • <template slot="xxx">...</template>
    • <template v-slot:xxx>...</template>
  • 作用域插槽
    • <template slot="xxx" slot-scope="props">...</template>
    • <template v-slot:xxx="props">...</template>
<template>
  <div>
    <slot />
    <slot name="title" />
    <slot name="item" v-bind="{ value: 'vue' }" />
  </div>
</template>

<script>
export default {
  name: "SlotDemo"
};
</script>

我们可以理解为万物皆“属性”,即它们都是父组件传递给子组件,然后子组件根据传递的内容来执行对应的行为。请看demo

<template>
  <div>
    {{ name }}
    <br />
    <button @click="handleChange">change name</button>
    <br />
    <!-- {{ slotDefault }} -->
    <VNodes :vnodes="slotDefault" />
    <br />
    <VNodes :vnodes="slotTitle" />
    <br />
    <VNodes :vnodes="slotScopeItem({ value: 'vue' })" />
  </div>
</template>

<script>
export default {
  name: "BigProps",
  components: {
    VNodes: {
      functional: true,
      render: (h, ctx) => ctx.props.vnodes
    }
  },
  props: {
    name: String,
    onChange: {
      type: Function,
      default: () => {}
    },
    slotDefault: Array,
    slotTitle: Array,
    slotScopeItem: {
      type: Function,
      default: () => {}
    }
  },
  methods: {
    handleChange() {
      this.onChange("Hello vue!");
    }
  }
};
</script>

懵懵懂懂,先做个记录,后面需要勤练习,加深里面......

组件基础

组件注册

Prop

----end---

相关文章

  • vue2 — 组件

    关于根组件 关于组件 关于click 关于img 关于过渡动画 关于v-for 关于class 上一篇: vue2...

  • vue组件

    关于vue组件的总结 注册组件 vue中组件的注册分为两种: 全局注册 局部注册 全局注册 全局注册的组件在任何v...

  • vue组件的使用模式

    最近使用vue的过程中,发现关于vue组件使用的问题,现根据我自己的理解,总结一下vue组件的使用模式:(1)多例...

  • vue 组件缓存清除实践

    写在前面 关于 vue 组件缓存的用法很简单,官网教程 讲解的很详细,关于 vue 组件缓存的带来的弊端网上也有很...

  • Vue 关于组件(一)

    在Vue中,组件:小型的,一个个独立,可以复用的UI模块。它有三大概念:属性、事件、插槽 属性 自定义属性prop...

  • 2018-04-12 vue父子组件间的通信

    vue + iview 关于父组件模态框内嵌子组件点击确认,执行父组件相应的方法 子组件 this.$emit('...

  • vue05

    vue2.0变化 在每个组件模板,不在支持片段代码 关于组件定义 Vue.extend 这种方式,在2.0里面有...

  • Vue高级API - Provide/Inject

    官网传送门:inject Vue2.2.0+ # 背景   关于Vue组件的通讯方式相信大家能倒背如流 父子组件...

  • vue递归组件自定义事件

    关于递归组件只调用一次的问题,解决方案示例: 父组件:parent.vue 树状组件:components/tre...

  • vue成长之路+实战+Vue2+VueRouter2+webpa

    推荐我的vue教程:VUE系列教程目录 上篇讲解了vue-router路由入门,现在讲讲关于vue组件的内容。如果...

网友评论

    本文标题:Vue 关于组件(一)

    本文链接:https://www.haomeiwen.com/subject/kfnfoqtx.html