【Vue文档补全计划】组件部分

本文详细介绍了Vue组件的data必须为函数的原因,命名规范的混乱及解决,包括kebab-case和PascalCase的使用场景。探讨了Prop的类型、大小写规则以及如何动态传递。同时讲解了单向数据流的重要性,以及如何监听子组件事件和使用v-model。最后,文章展示了局部注册组件的方法和注意事项。
摘要由CSDN通过智能技术生成

值得注意的小细节

一个组件的data必须是一个函数

<template>
  <button @click="count++">
  You clicked me {{ count }} times.
  </button>
</template>

<script>
export default {
  name: "button-counter",
  // 注意:体现在此处!!!
  data: function () {
    return {
      count: 0,
    };
  },
};
</script>

命名规范

我发现这个Vue中命名规范真的有点昏头的

  1. 组件名: kebab-case(文档中又说有:使用kebab-case和使用PascalCase这两种),晕了晕了;
  2. 事件名:不存在任何自动化的大小写转换,而是触发的事件名需要完全匹配监听这个事件所用的名称。因此推荐事件名始终使用 kebab-case

Prop

  1. 作用父组件通过Prop向子组件传递数据

  2. 大小写
    在使用DOM中的模板时,camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名
    总之,就是prop名称使用驼峰法,在DOM模板中使用短横线分隔命名。

  3. Prop类型
    任何类型的值都可以传给一个prop,假设要让每个 prop 都有指定的值类型,只需以对象形式列出 prop,这些 property 的名称和值分别是 prop 各自的名称和类型。

    props: {
      title: String,
      likes: Number,
      isPublished: Boolean,
      commentIds: Array,
      author: Object,
      callback: Function,
      contactsPromise: Promise // or any other constructor
    }
    
  4. 入门级别demo

    // 子组件:
    <template>
      <h3>{{ title }}</h3>
    </template>
    
    <script>
    export default {
      name: "article-title",
      // 注意这里
      props: ["title"],
    };
    </script>
    
    // 父级组件
    <article-title title="小明酱学Vue组件"></article-title>
    <article-title 
    	v-for="post in posts" 
    	:key="post.id" 
    	:title="post.title">
    </article-title>
    
  5. 静态传递或者动态传递
    如demo中所示:<article-title title="小明酱学Vue组件"></article-title>是给prop传入一个静态值,或者我们可以通过v-bind对prop进行动态赋值:<article-title v-for="post in posts" :key="post.id" :title="post.title"</article-title>

  6. 单向数据流
    所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。
    此外,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。


监听子组件事件

  1. 讲点知识点:
    父级组件通过v-on监听子组件的任意事件
    子组件通过调用内建的$emit方法传入事件名称来触发一个事件,同时可以使用$emit('事件',值)来传入参数,同时在父级组件中使用$event来访问抛出的值。
    注意:当事件是一个函数时,这个值会作为第一个参数传入这个方法

    <blog-post
      ...
      <!--onEnlargeText是一个函数,注意不带括号--!>
      v-on:enlarge-text="onEnlargeText"
    ></blog-post>
    
    methods: {
      onEnlargeText: function (enlargeAmount) {
        this.postFontSize += enlargeAmount
      }
    }
    
  2. 整个demo
    父级组件代码:

    // 使用v-on监视字体大小
    <div :style="{ fontSize: titleFontSize + 'em'}">
    // enlarge-text是子组件在点击按钮后要在父组件中触发的事件,即执行enlargeTitleFontSize()函数
    <article-title
    	@enlarge-text="enlargeTitleFontSize()"
    	title="小明酱学Vue组件"
    ></article-title>
    </div>
    
    methods: {
        enlargeTitleFontSize() {
    		this.titleFontSize = this.titleFontSize + 0.1;
        },
    },
    

子组件代码:<button @click="$emit("enlarge-text");">Enlarge text</button>


在组件上使用v-model

一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,在子组件的<input> 必须:将其 value attribute 绑定到一个名叫 value 的 prop 上,在其 input 事件被触发时,将新的值通过自定义的 input 事件抛出
子组件代码:

<template>
  <div>
  	<!--关键代码--!>
    <input
      :value="value"
      @input="$emit('input',$event.target.value)"
      @keyup.enter="printInputText"
    >

  </div>
</template>

<script>
export default {
  name:"custom-input",
  // 将其 value attribute 绑定到一个名叫 value 的 prop 上
  props:["value"],
  methods: {
  	// 这个方法是我为了显示输入框内容写的,与v-model无关
    printInputText(){
      this.$emit("print-input-text");
    }
  }
}
</script>

父组件代码:

<!--v-model="inputText" inputText:与输入框中内容绑定的变量--!>
<custom-input 
	v-model="inputText" 
	@print-input-text="printInputText"
>
</custom-input>

局部注册和模块系统

全局注册我用的很少了,先不写了

// 这是在模块系统进行局部注册
import ComponentA from './ComponentA.vue'
export default {
  components: {
    ComponentA
  },
  // ...
}

注意1:在 ES2015+ 中,在对象中放一个类似 ComponentA 的变量名其实是 ComponentA: ComponentA 的缩写,即这个变量名同时是:用在模板中的自定义元素的名称和包含了这个组件选项的变量名。
注意2:使用Babel或者webpack的模块系统时,推荐创建一个 components 目录,并将每个组件放置在其各自的文件中。

这是全局注册基础组件的占位坑(还没用到,但是感觉很有用的,用到在补充,嘻嘻)


以上是我工作中阅读代码遇到的一点问题的总结,还有很多高级的用法没有加上,以后用到在补充叭!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值