【Vue五分钟】 五分钟了解Vue组件的核心概念

简介: 组件其实是被认为是一个个独立的 UI 模块,一个系统就是由这些模块合起来。

1.Vue组件的核心概念--属性

组件其实是被认为是一个个独立的 UI 模块,一个系统就是由这些模块合起来。

2345_image_file_copy_381.jpg

不同组件其实就是 options 的不同。

2345_image_file_copy_382.jpg

关于 props 其实是不推荐直接 props 后面啪的是一堆东西,而是对象的形式一个个详细的给,方便后面的维护。

//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:()=>{}
}
},

不推荐用 onChange 这个名字,可能会与之后的函数冲突。至于我们父组件里多传了一个title 等原生属性而子组件却没有对齐进行处理则会默认自动挂载到根元素上!可以在子组件通过 inheritAttrs 置为 false 取消挂载。注意父组件传递过来的属性无法直接修改,因为是单向数据流。

2345_image_file_copy_383.jpg

答案:

2345_image_file_copy_384.jpg

在组件initProps方法的时候,会对props进行delineReactive操作,传入的第四个参数是自定义的sel的数,该函数会在触发props的set方法时执行,当props修改了,就会运行这里传入的第四个参数,然后进行判断,如果不Mroot根组件,并且不是更新子组件,那么说明更新的是props,所以会警告。

if (process.env.NODE_EN !== ' production '){
var hyphenatedKey = hyphenate(key);
if (isReservedAttribute(hyphenatedKey) ||
config.isReservedAttr(hyphenatedKey)){
warn(
("\""+ hyphenatedKey +"\" is a reserved attribute and cannot be used as component prop."),
vm
);
}
defineReactives$$1( props,key,value,function (){
if(!isRoot && !isUpdatingchildcomponent) {
warn(
"Avoid mutating a prop directly since the value will be " +"overwritten whenever the parent component re-renders." +
"Instead, use a data or computed property based on the prop's " +"value.Prop being mutated:"" + key +"\"",
vm
);));

2.Vue组件的核心概念--事件

2345_image_file_copy_385.jpg

<div>
name: {{ nane || "--" }}
<br/>
<input :value="name"" @change="handleChange"/>
<br/>
<br/>
<div @click="handleDivclick">
<button @click="handleClick">重置成功</button>&nbsp;&nbsp;&nbsp;
<button aclick.stop="handleClick">重置失败</button>
</div>
</div>
</template>
<script>
export default {
name:"EventDeno",
props:{
name: String,
methods:{
handleChange(e) {
this.$emit("change".e.target.value);
},
handleDivClick() {
  this.$emit("change","");
},
handleclick(e){
//都会失败
//e.stopPropagation()
:
</script>

这个其实就是输入的话触发 handleChange ,改变 name 值,点击按钮都会把 name 置为空,如果 .stop (即重置失败)会阻止冒泡以至于无法冒到 div 的点击事件(清空 name )也就 无法清空,如果在两个按钮的事件里用 stopPropagation 则点哪个按钮都无法置空.

3.Vue组件的核心概念--插槽

2345_image_file_copy_386.jpg

现在其实都不区分插槽了,推荐使用下面的方式即每一段下面那种(↑)。

<a-tab-pane key="slot" tab="插槽">
<h2>2.6新语法</h2>
<SlotDemo>
<p>default slot</p>
<template v-slot:title>
<p>title slot1</p>
<p>title siot2</p>
</template>
<template v-slot:item="props">
<p>item slot-scope {{ props }}</p>
</template>
</SlotDemo>
<br/>
<h2>老语法</h2>
<SlotDemo>
 <p>default slot</p>
<p slot="title">title slot1</p>
<p slot="title">title slot2</p>
<p slot="item" slot-scope="props">item slot-scope {{ props }}</p>
</SlotDeno>
<template>
<div>
<slot/>
<slot namea"title" />
<slot hame="item" v-bind="{ value: 'vue' } />
</div>
</template>
<script>
export default {
name: "SLotDemo"
};
</script> 

作用域插槽是通过 v-bind 的方式把属性传递过去.

2345_image_file_copy_387.jpg

所谓大属性就是这三类其实都可以通过属性去实现。

相关文章
|
1天前
|
JavaScript
vue知识点
vue知识点
7 2
|
1天前
|
JavaScript 程序员 网络架构
vue路由从入门到进阶 --- 声明式导航详细教程
vue路由从入门到进阶 --- 声明式导航详细教程
vue路由从入门到进阶 --- 声明式导航详细教程
|
1天前
|
资源调度 JavaScript UED
vue路由的基础知识总结,vueRouter插件的安装与使用
vue路由的基础知识总结,vueRouter插件的安装与使用
|
1天前
|
JavaScript
|
2天前
|
JavaScript 前端开发 安全
Vue响应式设计
【5月更文挑战第30天】Vue响应式设计
20 1
|
2天前
|
编解码 JavaScript API
Vue在移动端的表现如何?
【5月更文挑战第30天】Vue在移动端的表现如何?
8 2
|
2天前
|
JavaScript 前端开发 API
Vue与其他框架的对比优势
【5月更文挑战第30天】Vue与其他框架的对比优势
11 1
|
3天前
|
JavaScript
Vue常用知识点总结
Vue常用知识点总结
10 0
|
3天前
|
JavaScript Java 测试技术
基于vue和微信小程序的校园自助打印系统+springboot+vue.js附带文章和源代码设计说明文档ppt
基于vue和微信小程序的校园自助打印系统+springboot+vue.js附带文章和源代码设计说明文档ppt
23 7
|
3天前
|
JSON JavaScript 前端开发