每日一VUE——组件基础

认识组件

组件由templatescriptstyle三部分组成。

如何使用

  1. 定义组件
  2. 注册组件
  3. 调用组件

注册方式

  • 全局注册
  • 局部注册

以上部分不做赘述了


组件间传递数据

props

在子组件中添加props选项,表示从父组件接受参数

<body>
  <div id="app">
    <!-- 使用Greeting组件 -->
    <greeting name="Alice" message="Hello"></greeting>

    <!-- 使用WeatherDisplay组件 -->
    <weather-display
      :temperature="25"
      :weather-condition="'Sunny'"
      :location="'Beijing'"
    />
  </div>

  <script>
    Vue.component('Greeting', {
      template: '<div class="greeting"><span>{{ message }}, {{ name }}!</span></div>',
      props: {
        name: String,
        message: String
      }
    });

    Vue.component('WeatherDisplay', {
      template: '<div class="weather-display">' +
        '<h2>当前天气</h2>' +
        '<p>温度: {{ temperature }}°C</p>' +
        '<p>天气: {{ weatherCondition }}</p>' +
        '<p>地点: {{ location }}</p>' +
      '</div>',
      props: {
        temperature: Number,
        weatherCondition: String,
        location: String
      }
    });

    new Vue({
      el: '#app'
    });
  </script>
</body>

props表示从上到下的数据流传递,即父组件的数据变化会向下引发传递到子组件的数据更新,反之不行。

/这就意味着不应该在子组件内部修改props选型中的属性值

props的验证

  1. 数据类型验证
props:{
	age:[String, Number, Boolean]
}
  1. 必填值验证
props:{
	age:{
		type: String,
		required: true
	}
}
  1. 默认值验证
props:{
	age:{
		type: String,
		default: 20
	}
}

如果数据类型为数组或者对象数据类型的数据,声明default时要使用函数返回

props:{
	people:{
		type: object,
		default: function(){
			return{
				name:...,
				age:...,
				message:...
			}
		}
	}
}
  1. 自定义验证
props:{
	age:{
		vaildator(value) {
			return value >=0 && value<=100
		}
	}
}

组件事件

props选项实现了从父组件到子组件的单项传递。可以通过组件事件实现父组件可以监听到子组件数据的变化,即子组件向父组件传递数据。

  1. 在子组件中,使用emits选项声明自定义事件;定义可以触发==$emit==内置函数的事件
  2. 当父组件调用子组件时,要使用v-on监听自定义事件,还要再父组件中声明相应事件的处理函数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

组件事件的验证

在触发事件时传递的数据作为验证函数的参数,

就是在emits选项声明时从数组方式变为对象方式,每个事件为一个函数,该函数用为验证事件的有效性。

emits:['delete'],  //数组方式
emits:{            //对象方式
	delete: function(value){
		if(value == 1)
        	return true
         else
         	return false
	}
}

v-model与自定义事件结合使用

结合使用 v-model 和自定义事件时,通常不需要在父组件中使用 @ 指令来监听子组件的自定义事件,因为 v-model 已经处理了数据的双向绑定。

在父组件中使用v-model绑定到子组件时,Vue会自动将v-model绑定的值与子组件的某个属性同步,并在内部使用一个名为==update:加上属性名的事件==来通知子组件更新其属性值。

在这里插入图片描述

组件插槽

插槽允许父组件的内容插入到子组件模板的指定位置,可以在不修改子组件代码的情况下,灵活地定制子组件的输出内容,从而实现模板的复用和内容的动态定制。

  • 默认插槽
  • 具名插槽

v-solt指令用于在调用子组件时声明具名插槽,简写:#

//自组件模板结构
<div>
    <solt name='left'><button class='left'>返回</button></solt>
    <solt name='middle'><input type='text'></solt>
    <solt name='right'><button class='right'>确定</button></solt>
</div>
//父组件调用子组件
<child-component>
    <tempalte v-solt:插槽名>
        父组件中替换子组件的内容
    <tempalte>
<child-component>
  • 作用域插槽

作用域插槽允许由子组件提供参数给父组件,父组件可以根据这些参数来定制插槽内容

//自组件模板结构
<div>
    <solt name='left' :num=10><button class='left'>返回</button></solt>  //插槽中的name属性不会作为参数传递
    <solt name='middle'><input type='text'></solt>
    <solt name='right'><button class='right'>确定</button></solt>
</div>
//父组件调用子组件
<child-component>
    <tempalte #v-solt='leftProps'> //自定义对象名
        购物车{{leftProps.num}}
    <tempalte>
<child-component>

动态组件

is属性通常与组件结合使用,来动态地决定在某个位置应该渲染哪个组件,实现同一元素内不同组件间的动态切换

<template>
  <div>
    <!-- 动态组件 -->
    <component :is="currentComponent"></component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      currentComponent: 'component-a'
    };
  },
  components: {
    componentA: {
      template: '<div>这是组件A</div>'
    },
    componentB: {
      template: '<div>这是组件B</div>'
    }
  }
};
</script>

内置组件keep-alive

我们可以使用keep-alive将被卸载的组件保存到内存中,以保持存活状态,提高程序效率

<keep-alive>
    <component :is="currentComponent"></component>
</keep-alive>

若有错误与不足请指出,关注DPT一起进步吧!!!

  • 32
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
组件Vue.js 中最重要的概念之一。组件可以让我们将 UI 拆分为独立、可复用的部件,使得代码更加清晰、易于维护。在 Vue.js 中,组件可以分为全局组件和局部组件,其中全局组件可在任何地方使用,而局部组件只能在其父组件中使用。 定义组件时,需要使用 Vue.component() 方法,该方法需要传入两个参数:组件名称和组件配置对象。组件名称应该采用 kebab-case(短横线分隔命名)格式,以便在 HTML 中使用。 示例代码如下: ```javascript // 定义一个名为 button-counter 的新组件 Vue.component('button-counter', { data: function () { return { count: 0 } }, template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>' }) ``` 在上述代码中,我们定义了一个名为 button-counter 的组件,该组件包含一个计数器,每次点击按钮计数器加一。 在 HTML 中使用组件时,需要使用组件名称作为自定义标签来调用组件。示例代码如下: ```html <div id="app"> <button-counter></button-counter> </div> ``` 在上述代码中,我们调用了 button-counter 组件,并将其渲染到了 id 为 app 的 div 元素中。 除了组件的 data 和 template 属性外,还可以使用 props 属性来传递组件之间的数据。使用 props 时,需要在组件的配置对象中定义 props 属性,并在 HTML 中使用 v-bind 指令来传递数据。 示例代码如下: ```javascript // 定义一个名为 todo-item 的新组件 Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app', data: { groceryList: [ { id: 0, text: '蔬菜' }, { id: 1, text: '水果' }, { id: 2, text: '奶酪' } ] } }) ``` 在上述代码中,我们定义了一个名为 todo-item 的组件,并使用 props 属性定义了一个名为 todo 的 prop。在 HTML 中,我们使用 v-bind 指令将 groceryList 数组中的每个对象传递给了 todo-item 组件。示例代码如下: ```html <div id="app"> <ul> <todo-item v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"></todo-item> </ul> </div> ``` 在上述代码中,我们使用 v-for 指令遍历 groceryList 数组,并使用 v-bind 指令将数组中的每个对象传递给了 todo-item 组件。注意,我们还需要使用 v-bind:key 指令来为每个列表项指定一个唯一的 key 值。 插槽是 Vue.js 中另一个重要的概念。插槽可以让父组件在子组件中插入任意的 HTML 内容,使得组件更加灵活、可复用。 在子组件中,使用 <slot> 标签来定义插槽。在父组件中,使用子组件的自定义标签来调用组件,并在标签内部插入 HTML 内容。示例代码如下: ```javascript // 定义一个名为 alert-box 的新组件 Vue.component('alert-box', { template: ` <div class="alert-box"> <strong>Error!</strong> <slot></slot> </div> ` }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app' }) ``` 在上述代码中,我们定义了一个名为 alert-box 的组件,并在组件中定义了一个插槽。在 HTML 中,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。示例代码如下: ```html <div id="app"> <alert-box> <p>Something bad happened.</p> </alert-box> </div> ``` 在上述代码中,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。该 HTML 内容会被插入到 alert-box 组件的插槽中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我DPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值