vue3组件通信学习笔记

1、Prop

父组件

<template><div class="parent"><h1>我是父元素</h1><Child :msg="msg"></Child></div>
</template><script setup>
import Child from './Child.vue'
let msg = ref('我是父组件的数据')
</script><style scoped>
.parent{width: 800px;height: 600px;background: skyblue;
}
</style>

子组件

<template><div class="son"><h3>我是子元素</h3><h4>{{ msg }}</h4></div>
</template><script setup>
// 1、let props = defineProps(['msg'])
//2、defineProps(['msg'])
//3、
defineProps({msg:{type:String,default:'默认数据'}
})
</script><style scoped>
.son{width: 200px;height: 200px;background: pink;
}
</style>

在这里插入图片描述

2、自定义事件

父组件

<template><div class="parent"><h1>我是父元素</h1><Child :msg="msg" @getData="getData"></Child><hr><p>父组件接收数据:{{passStr}}</p></div>
</template><script setup>
import Child from './Child.vue'
let msg = ref('我是父组件的数据');
let passStr = ref('')
const getData = (e)=>{passStr.value=e
}
</script><style scoped>
.parent{width: 800px;height: 600px;background: skyblue;
}
</style>

子组件

<template><div class="son"><h3>我是子元素</h3><h4>{{ msg }}</h4><button @click="passData('我是子组件数据')">给父组件传递参数</button></div>
</template><script setup>
// 1、let props = defineProps(['msg'])
//2、defineProps(['msg'])
//3、
defineProps({msg:{type:String,default:'默认数据'}
})
let $emit = defineEmits('getData')
const passData = (msg)=>{$emit('getData',msg)
}
</script><style scoped>
.son{width: 200px;height: 200px;background: pink;
}
</style>

在这里插入图片描述

3、全局事件总线

1、安装

npm install --save mitt

2、新建utils/mitt.js

import mitt from 'mitt'const emitter =new mitt()export default emitter

3、使用

子组件1

<template><div class="son"><h3>我是子元素</h3><h4>{{ msg }}</h4><button @click="passData('我是子组件数据')">给父组件传递参数</button><button @click="passBusData('我是子组件1的数据')">给子组件2传递参数</button></div>
</template><script setup>
import emitter from '../utils/mitt'
// 1、let props = defineProps(['msg'])
//2、defineProps(['msg'])
//3、
defineProps({msg:{type:String,default:'默认数据'}
})
let $emit = defineEmits('getData')
const passData = (msg)=>{$emit('getData',msg)
}
const instance = getCurrentInstance()
const passBusData = (msg) =>{emitter.emit("passBusData",msg)
}
</script><style scoped>
.son{width: 200px;height: 200px;background: pink;
}
</style>

子组件2

<template><div class="child1"><h3>子组件2</h3><p>{{msg}}</p></div>
</template><script setup>
import emitter from '../utils/mitt'
let msg = ref('')
onMounted(() => {emitter.on("passBusData",(data) =>{msg.value=data})
});
</script><style  scoped>
.child1{width: 200px;height: 200px;background: hotpink;
}
</style>

在这里插入图片描述

4、v-model

1、绑定单个数据

父组件

<template><div class="parent"><h1>父组件钱数:{{money}}</h1><input type="number" v-model="money"><!-- props:父组件给子组件传值 --><!-- <Child :modelValue="money" @update:modelValue="getData" /> --><!-- v-model组件身上使用1、相当于给子组件传递props[modelValue] = 10002、给子组件绑定自定义事件update:modelValue--><Child v-model="money" /></div>
</template><script setup>
import Child from './Child.vue';
import { ref } from 'vue';
// v-model 指令 收集表单数据,双向数据绑定
// v-model也可以实现组件之间通信,实现父子组件数据同步
// 父组件给子组件传数据 props
// 子组件给父组件传数据 自定义事件
let money = ref(1000);
const getData = (data)=>{money.value = data
}
</script><style lang="scss" scoped>
.parent{width:800px;height:500px;background: pink;
}
</style>

子组件

<template><div class="child"><h3>子组件接收父组件钱数{{modelValue}}</h3><button @click="handler">子组件改变数据</button></div>
</template><script setup>
let props = defineProps(['modelValue']);
let emits = defineEmits(['update:modelValue']);
const handler = () => {emits('update:modelValue',props.modelValue+100)
}
</script><style lang="scss" scoped>
.child{width: 300px;height: 200px;background: skyblue;
}
</style>

在这里插入图片描述

2、绑定多个数据

父组件

<template><div class="parent"><h2>父组件钱数:{{money}}当前页{{currentPage}}每页条数{{pageSize}}</h2><input type="number" v-model="money"><!-- props:父组件给子组件传值 --><!-- <Child :modelValue="money" @update:modelValue="getData" /> --><!-- v-model组件身上使用1、相当于给子组件传递props[modelValue] = 10002、给子组件绑定自定义事件update:modelValue--><Child v-model="money" /><Child2 v-model:currentPage="currentPage" v-model:pageSize="pageSize"></Child2></div>
</template><script setup>
import Child from './Child.vue';
import Child2 from './Child2.vue';
import { ref } from 'vue';
// v-model 指令 收集表单数据,双向数据绑定
// v-model也可以实现组件之间通信,实现父子组件数据同步
// 父组件给子组件传数据 props
// 子组件给父组件传数据 自定义事件
let money = ref(1000);
const getData = (data)=>{money.value = data
}
//
let currentPage =ref(1)
let pageSize =ref(20)
</script><style lang="scss" scoped>
.parent{width:800px;height:600px;background: pink;
}
</style>

子组件

<template><div class="child2"><h3>子组件2接收父组传递的数据{{currentPage}}{{ pageSize }}</h3><button @click="emits('update:currentPage',currentPage+1)">改变父组件currentPage</button><button @click="emits('update:pageSize',pageSize+10)">改变父组件pageSize</button></div>
</template><script setup>
let props=defineProps(['currentPage','pageSize'])
let emits= defineEmits(['update:currentPage','update:pageSize'])
</script><style lang="scss" scoped>
.child2{width:300px;height:200px;background: hotpink;
}
</style>

在这里插入图片描述

5、useAttr

父组件

<template><div class="parent"><h2>父组件</h2><Child type="primary" title="编辑按钮" size="small" @click="handler" /></div>
</template><script setup>
import Child from './Child.vue';
const handler = ()=>{alert('点击了')
}
</script><style lang="scss" scoped>
.parent{width:800px;height:600px;background: pink;
}
</style>

子组件

<template><div class="child"><h3>子组件</h3><!-- <el-button :type="$attrs.type" :size="$attrs.size">按钮</el-button> --><el-button :="$attrs">按钮</el-button></div>
</template><script setup>
//引入useAttrs方法:获取组件标签身上属性与事件
let $attrs = useAttrs()let props= defineProps(['title'])
console.log(props)
console.log($attrs)
//props和useAttrs方法都可以获取父组件传过来的属性和属性值
//但是props接收了useAttrs方法就获取不到了
</script><style lang="scss" scoped>
.child{width: 300px;height: 200px;background: skyblue;
}
</style>

在这里插入图片描述

6、ref与$parent

父组件

<template><div class="parent"><h2>父组件钱数:{{money}}</h2><button @click="borrowMoney">向子组件借100</button><Child ref="child" /></div>
</template><script setup>
import Child from './Child.vue';
// ref可以获取真实的DOM节点,可以获取到组件真实VC
//$parent 可以在子组件内部获取父组件的实例
let money = ref(1000)//向外暴露
defineExpose({money
})
//获取子组件实例
let child = ref();//借钱
let borrowMoney = ()=>{money.value+=100;child.value.money-=100;//child.value.handler()
}
</script><style lang="scss" scoped>
.parent{width:800px;height:600px;background: pink;
}
</style>

子组件

<template><div class="child"><h3>子组件钱数:{{money}}</h3><button @click="handler($parent)">向父组件借钱100</button></div>
</template><script setup>
let money = ref(1000)
//组件内部的数据是对外关闭的,别人不能访问
//如果想让外部访问需要通过defineExpose方法对外暴露
let handler = ($parent)=>{console.log('子组件事件');money.value+=100;$parent.money-=100
}
defineExpose({money,handler
})
</script><style lang="scss" scoped>
.child{width: 300px;height: 200px;background: skyblue;
}
</style>

在这里插入图片描述

7、Provide与Inject

父组件

<template><div class="parent"><h2>父组件数据:{{car}}</h2><Child ref="child" /></div>
</template><script setup>
import Child from './Child.vue';
//vue3提供provide(提供)与inject(注入)可以实现隔辈组件传递数据
let car = ref('法拉利');
//祖先组件给后代组件传递数据
//两个参数,第一个参数是提供数据的数据key
//第二个参数 祖先组件提供的数据
provide('car', car);
</script><style lang="scss" scoped>
.parent{width:800px;height:600px;background: pink;
}
</style>

子组件

<template><div class="child"><h3>子组件</h3><Grandson></Grandson></div>
</template><script setup>
import Grandson from './Grandson.vue';
</script><style lang="scss" scoped>
.child{width: 300px;height: 200px;background: skyblue;
}
</style>

孙子组件

<template><div class="grandson"><h5>孙子组件接收祖先组件传递的数据:{{car}}</h5><button @click="updateData">更改祖先组件数据</button></div>
</template><script setup>
//注入祖先组件提供的数据
//需要参数:即为祖先组件提供数据的key
let car = inject("car");
let updateData = ()=>{car.value='宝马'
}
</script><style lang="scss" scoped>
.grandson{width:200px;height: 100px;background: yellowgreen;
}
</style>

在这里插入图片描述

8、pinia

1、安装

pnpm i pinia

2、在src文件夹下创建store文件夹,新建index.js

//创建大仓库
import { createPinia } from 'pinia';
//createPinia方法可以用来创建大仓库
let store = createPinia();
//对外暴露,安装仓库
export default store

3、在main.js中引入使用

//引入仓库
import store from './store'
let app= createApp(App);app.use(store).mount('#app')

4、在store文件夹下新建modules文件夹,新建info.js

1、选择式写法

1、info.js

//定义info小仓库
import { defineStore } from "pinia";//2个参数:1、小仓库名称 2小仓库配置对象
//defineStore方法执行返回一个函数,函数作用让组件获取到仓库数据
let useInfoStore = defineStore("info",{//存储数据 statestate: ()=>{return {count:99,arr:[1,2,3,4,5,6,7,8,9,10]}},actions:{updateCount(num){// this.count++this.count+=num;}},getters:{total(){return this.arr.reduce((pre,next)=>{return pre+next},0)}}
})//对外暴露
export default useInfoStore;

2、在组件1中使用

<template><div class="child"><h3>子组件-接收仓库数据:{{infoStore.count}}</h3><h4>getters:数组求和:{{infoStore.total}}</h4><button @click="updateCount">修改仓库数据</button></div>
</template><script setup>
import useInfoStore from '../store/modules/info';
//获取小仓库对象
let infoStore = useInfoStore();
console.log(infoStore)
//修改仓库数据
let updateCount = ()=>{//1、直接修改//infoStore.count++//2、patch// infoStore.$patch({//     count:100// })//3、调用store方法infoStore.updateCount(10)
}
</script><style lang="scss" scoped>
.child{width: 300px;height: 200px;background: skyblue;
}
</style>

3、在组件2中使用

<template><div class="child2"><h3>子组件2-接收仓库数据:{{infoStore.count}}</h3></div>
</template><script setup>
import useInfoStore from '../store/modules/info';
//获取小仓库对象
let infoStore = useInfoStore();</script><style lang="scss" scoped>
.child2{width:300px;height:200px;background: hotpink;
}
</style>

在这里插入图片描述

2、组合式API写法

1、在modules文件夹下新建todo.js

//定义组合式API
import { defineStore } from "pinia";
import { ref , computed } from 'vue'
//创建小仓库
let useTodoStore = defineStore('todo',()=>{//务必返回一个对象,对象的属性和方法提供给组件使用let todos = ref([{id:1,title:'吃饭'},{id:2,title:'睡觉'},{id:3,title:'打豆豆'},])let arr=ref([1,2,3,4,5])const total = computed(()=>{return arr.value.reduce((prev, curr) => {return prev+curr}, 0)})return {todos,//相当于选择式API的statearr,total,updateTodos(){todos.value.push({id:4,title:'摆烂'})},//相当于选择式API的actions}})export default useTodoStore

2、在组件1中使用

<template><div class="child"><h3>子组件-接收仓库数据:</h3><ul><li v-for="item in todosStore.todos" :key="item.id">{{item.title}}</li></ul><p>{{ todosStore.arr }}--总和{{todosStore.total}}</p><button @click="updateTodos">修改仓库数据</button></div>
</template><script setup>
//引入组合式API函数仓库
import useTodosStore from '../store/modules/todo';
let todosStore = useTodosStore();
//修改仓库数据
let updateTodos = ()=>{todosStore.updateTodos()
}
</script><style lang="scss" scoped>
.child{width: 300px;height: 300px;background: skyblue;
}
</style>

3、在组件2中使用

<template><div class="child2"><h3>子组件2-接收仓库数据:</h3><ul><li v-for="item in todosStore.todos" :key="item.id">{{item.title}}</li></ul></div>
</template><script setup>
import useTodosStore from '../store/modules/todo';
//获取小仓库对象
let todosStore = useTodosStore();</script><style lang="scss" scoped>
.child2{width:300px;height:300px;background: hotpink;
}
</style>

在这里插入图片描述

9、slot

1、默认插槽

父组件

<template><div class="parent"><h2>父组件</h2><div class="container"><Child><pre>我是父组件传入的数据</pre></Child></div></div>
</template><script setup>
import Child from './Child.vue';
//插槽:默认插槽、具名插槽、作用域插槽
</script><style lang="scss" scoped>
.parent{width:800px;height:400px;background: pink;.container{display: flex;align-items: center;justify-content: space-around;}
}
</style>

子组件

<template><div class="child"><h3>我是子组件默认插槽</h3><!-- 默认插销 --><slot></slot><h3>我是子组件默认插槽</h3></div>
</template><script setup>
//引入组合式API函数仓库
import useTodosStore from '../store/modules/todo';
let todosStore = useTodosStore();
//修改仓库数据
let updateTodos = ()=>{todosStore.updateTodos()
}
</script><style lang="scss" scoped>
.child{width: 300px;height: 300px;background: skyblue;
}
</style>

在这里插入图片描述

2、具名插槽

父组件

<template><div class="parent"><h2>父组件</h2><div class="container"><Child><!-- 具名插槽填充 v-slot:简写问# --><template v-slot:a><p>我是填充具名插槽a位置结构</p></template><template #b><p>我是填充具名插槽b位置结构</p></template></Child></div></div>
</template><script setup>
import Child from './Child.vue';
//插槽:默认插槽、具名插槽、作用域插槽
</script><style lang="scss" scoped>
.parent{width:800px;height:400px;background: pink;.container{display: flex;align-items: center;justify-content: space-around;}
}
</style>

子组件

<template><div class="child"><h3>我是子组件具名插槽</h3><slot name="a"></slot><h3>我是子组件具名插槽</h3><hr><h3>我是子组件具名插槽</h3><slot name="b"></slot><h3>我是子组件具名插槽</h3></div>
</template><script setup>
//引入组合式API函数仓库
import useTodosStore from '../store/modules/todo';
let todosStore = useTodosStore();
//修改仓库数据
let updateTodos = ()=>{todosStore.updateTodos()
}
</script><style lang="scss" scoped>
.child{width: 300px;height: 300px;background: skyblue;
}
</style>

3、作用域插槽

父组件

<template><div class="parent"><h2>父组件</h2><div class="container"><Child :todos="todos"><template v-slot="{$row,$index}"><span :style="{color:$row.done?'green':'red'}">{{ $row.title }}--下标{{$index}}</span></template></Child></div></div>
</template><script setup>
import Child from './Child.vue';
// import Child2 from './Child2.vue';
//插槽:默认插槽、具名插槽、作用域插槽
//作用域插槽:就是可以传递数据的插槽,子组件可以将数据回传给父组件,
//父组件可以决定这些回传的数据是以何种结构或者外观在子组件内部去展示
let todos = ref([{id:1,title:'吃饭',done:true},{id:2,title:'睡觉',done:false},{id:3,title:'打豆豆',done:true},{id:4,title:'打游戏',done:false},
])
</script><style lang="scss" scoped>
.parent{width:800px;height:400px;background: pink;.container{display: flex;align-items: center;justify-content: space-around;}
}
</style>

子组件

<template><div class="child"><h3>子组件1</h3><ul><li v-for="(item,index) in todos" :key="item.id"><!-- 作用域插槽:可以将数据回传给父组件 --><slot :$row="item" :$index="index"></slot></li></ul></div>
</template><script setup>
let props = defineProps(['todos'])
</script><style lang="scss" scoped>
.child{width: 500px;height: 300px;background: skyblue;
}
</style>

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/123516.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探讨前后端分离开发的优势、实践以及如何实现更好的用户体验?

随着互联网技术的迅猛发展&#xff0c;前后端分离开发已经成为现代软件开发的一种重要趋势。这种开发模式将前端和后端的开发工作分开&#xff0c;通过清晰的接口协议进行通信&#xff0c;旨在优化开发流程、提升团队协作效率&#xff0c;并最终改善用户体验。本文将深入探讨前…

申威芯片UOS中opencv DNN推理

Cmake&#xff0c;opencv&#xff0c;opencv-contribute安装 #apt可能需要更新apt update apt install -y wget unzip apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev#安装cmake apt i…

ES6的面向对象编程以及ES6中的类和对象

一、面向对象 1、面向对象 &#xff08;1&#xff09;是一种开发思想&#xff0c;并不是具体的一种技术 &#xff08;2&#xff09;一切事物均为对象&#xff0c;在项目中主要是对象的分工协作 2、对象的特征 &#xff08;1&#xff09;对象是属性和行为的结合体 &#x…

设计模式行为型-模板模式

文章目录 一&#xff1a;模板方法设计模式概述1.1 简介1.2 定义和目的1.3 关键特点1.4 适用场景 二&#xff1a;模板方法设计模式基本原理2.1 抽象类2.1.1 定义和作用2.1.2 模板方法2.1.3 具体方法 2.2 具体类2.2.1 定义和作用2.2.2 实现抽象类中的抽象方法2.2.3 覆盖钩子方法 …

27.CSS粒子特效

效果 源码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Vanilla JS Particles</title><link rel="stylesheet" href="style.css"> </head> <body>…

使用半导体材料制作霍尔元件的优点

霍尔元件是一种基于霍尔效应的传感器&#xff0c;可以测量磁场强度和电流等物理量。霍尔效应是指&#xff0c;当电流通过一块导体时&#xff0c;如果该导体置于垂直于电流方向的磁场中&#xff0c;就会在导体两侧出现一定的电势差&#xff0c;这就是霍尔效应。霍尔元件可以利用…

分享一下怎么做微信营销活动

微信营销活动是商家利用微信平台进行宣传和推广的一种重要方式。通过精心策划的微信营销活动&#xff0c;商家可以吸引更多的潜在客户&#xff0c;提高品牌知名度和销售额。本文将介绍如何策划和实施一次成功的微信营销活动。 一、明确目标 在策划微信营销活动之前&#xff0c…

@PostConstruct使用

PostConstruct是Java自带的注解&#xff0c;在方法上加该注解会在项目启动的时候执行该方法&#xff0c;也可以理解为在spring容器初始化的时候执行该方法。 从Java EE5规范开始&#xff0c;Servlet中增加了两个影响Servlet生命周期的注解&#xff0c;PostConstruc

Linux的LVM磁盘扩容

目录 引子环境扩容步骤结束 引子 最近因为有个服务器的磁盘和内容太小了&#xff0c;连按tab都要提示No space left on device了&#xff0c;实在受不了了&#xff0c;更何况服务器的项目也因为没有空间直接崩了&#xff0c;在领导申请到了内存和磁盘后立马着手去扩硬盘&#…

Redis-Cluster集群的部署(详细步骤)

一、环境准备 本次实操为三台机器&#xff0c;关闭防火墙和selinux 注:规划架构两种方案&#xff0c;一种是单机多实例&#xff0c;这里我们采用多机器部署 三台机器&#xff0c;每台机器上面两个redis实例&#xff0c;一个master一个slave&#xff0c;第一列做主库&#xff…

Tomcat详解 一:tomcat的部署

文章目录 1. Tomcat的基本介绍1.1 Tomcat是什么1.2 Tomcat的构成组件1.2.1 Web容器1.2.2 Servlet容器1.2.3 JSP容器&#xff08;JAVA Scripts page&#xff09; 1.3 核心功能1.3.1 Container 结构分析 1.4 配置文件1.5 Tomcat常用端口号1.6 启动和关闭Tomcat 2. 部署Tomcat服务…

OLED透明屏模块:引领未来显示技术的突破

OLED透明屏模块作为一项引领未来显示技术的突破&#xff0c;以其独特的特点和卓越的画质在市场上引起了广泛关注。 根据行业报告&#xff0c;预计到2025年&#xff0c;OLED透明屏模块将占据智能手机市场的20%份额&#xff0c;并在汽车导航系统市场中占据30%以上份额。 那么&am…

从一到无穷大 #13 How does Lindorm TSDB solve the high cardinality problem?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言优势挑战系统架构细节/优化存储引擎索引写入查询 经验Ablation Study总结 引言 …

springboot + activiti实现activiti微服务化

概述 本文介绍如何将springbootactiviti进行整合,并配合eureka,zuul和feign实现activiti的微服务化,将流程控制和业务逻辑分离. 并实现了几个比较特殊的功能,比如时间段委托(某人请假或出差,出差时间内,所有待办交给被委托人处理),比如节点的无限级加签功能(流程本身有不确定性…

java八股文面试[数据库]——explain

使用 EXPLAIN 关键字可以模拟优化器来执行SQL查询语句&#xff0c;从而知道MySQL是如何处理我们的SQL语句的。分析出查询语句或是表结构的性能瓶颈。 MySQL查询过程 通过explain我们可以获得以下信息&#xff1a; 表的读取顺序 数据读取操作的操作类型 哪些索引可以被使用 …

SpringMVC相对路径和绝对路径

1.相对地址与绝对地址定义 在jsp&#xff0c;html中使用的地址&#xff0c;都是在前端页面中的地址&#xff0c;都是相对地址 地址分类&#xff1a;&#xff08;1&#xff09;&#xff0c;绝对地址&#xff0c;带有协议名称的是绝对地址&#xff0c;http://www.baidu.com&…

JavaScript-----DOM元素

目录 前言&#xff1a; 1. DOM介绍 2. 获取节点 3. 操作HTML内容 4. 监听事件 案例 5. 操作节点的标签属性 6. 操作样式 7. 创建、添加、删除节点 前言&#xff1a; 在此之前我们要想去操作网页元素一般是去通过CSS选择器实现的&#xff0c;今天我们就学习JavaScript里…

momentjs实现DatePicker时间禁用

momentjs是一个处理时间的js库&#xff0c;简洁易用。 浅析一下&#xff0c; momentjs 在vue中对DatePicker时间组件的禁用实践。 一&#xff0c;npm下载 npm install moment --save二&#xff0c;particles.json中 "dependencies": {"axios": "^…

ICCV 2023 | MoCoDAD:一种基于人体骨架的运动条件扩散模型,实现高效视频异常检测

论文链接&#xff1a; https://arxiv.org/abs/2307.07205 视频异常检测&#xff08;Video Anomaly Detection&#xff0c;VAD&#xff09;扩展自经典的异常检测任务&#xff0c;由于异常情况样本非常少见&#xff0c;因此经典的异常检测通常被定义为一类分类问题&#xff08;On…

从0到1构建界面设计系统思维

用户界面&#xff08;UI&#xff09;是人与机器之间发生交互的载体&#xff0c;也是用户体验&#xff08;UX&#xff09;的一个组成部分。用户界面由两个主要部分组成&#xff1a;视觉设计&#xff08;即传达产品的外观和感觉&#xff09;和交互设计&#xff08;即元素的功能和…