vue:component组件

使用组件三步:

组件是实现局部功能的代码集合和资源集

  • 创建组件,分为全局组件和局部组件,组件中data必须写成函数,而不是对象,否则会报错
  • 注册组件
  • 添加组件标签

组件的好处:复用性好,层次结构清晰
组件命名注意:

  • 不能使用标签名
  • 大驼峰命名会报错

component组件(vc)理解:

  • 本质是一个vc的构造函数,是Vue.extend生成的
  • 每一个组件都有一个全新的对应的vc
  • 我们只需要配置组件名,vue会帮我们创建组件的实例对象
  • this的指向:组件中的data、methods、watch、computed等都指向vc;new Vue()中的this都是指向vue实例对象

vc和vm区别与联系:

  • 联系:vc有的功能,vm都有,并且vm中怎么使用,在vc中就怎么使用
  • 区别:vm中可以配置一个el根元素,而vc中不能配置,vc中的data必须配置一个函数,而不是一个对象,因为函数是重新返回一个值,而对象会导致引用出现问题

内置对象关系:

  • 组件在创建的时候,生成的是组件的原型对象,即:vue.extend(),有原型对象属性prototype,只有在被vue解析到组件标签的时候,才会创建组件的实例对象,即:new VueComponent(),有实例属性对象__prototype__,并且这两个对象是完全相同的,vc的原型对象的会指向vm的原型对象

2021-12-02 11:37

### VueComponent 动态组件的使用方法 #### 基本概念 在 Vue 中,`<component>` 是一个特殊的内置元素,用于动态地挂载不同类型的组件。它通过 `is` 属性来决定具体渲染哪个组件[^2]。 #### 项目结构示例 假设有一个简单的 Vue 项目结构如下: ```plaintext . ├── package.json └── src ├── App.vue ├── components │ ├── ComponentA.vue │ ├── ComponentB.vue │ └── ComponentC.vue └── main.js ``` 其中,`ComponentA.vue`, `ComponentB.vue`, 和 `ComponentC.vue` 是三个独立的子组件。 --- #### 示例代码:基本用法 以下是 `<component>` 的基础实现方式: ```vue <!-- ParentComponent.vue --> <template> <div> <!-- 使用 component 标签并绑定 is 属性 --> <component :is="currentComponent"></component> <!-- 切换按钮 --> <button @click="changeToA">切换到 A</button> <button @click="changeToB">切换到 B</button> <button @click="changeToC">切换到 C</button> </div> </template> <script> import ComponentA from './components/ComponentA.vue'; import ComponentB from './components/ComponentB.vue'; import ComponentC from './components/ComponentC.vue'; export default { data() { return { currentComponent: 'ComponentA', // 默认显示 ComponentA }; }, methods: { changeToA() { this.currentComponent = 'ComponentA'; }, changeToB() { this.currentComponent = 'ComponentB'; }, changeToC() { this.currentComponent = 'ComponentC'; }, }, components: { ComponentA, ComponentB, ComponentC, }, }; </script> ``` 在这个例子中,通过改变 `currentComponent` 的值可以动态切换展示的组件[^3]。 --- #### 异步加载组件 为了优化性能,Vue 支持异步加载组件。可以通过 JavaScript 的 `defineAsyncComponent` 方法或者直接返回 Promise 来定义异步组件。 ##### 示例代码:异步加载组件 ```javascript // 定义异步组件 const AsyncComponentA = defineAsyncComponent(() => import('./components/ComponentA.vue') ); export default { components: { AsyncComponentA, }, }; ``` 在这种情况下,当组件被首次访问时才会触发导入操作,从而减少初始页面加载时间。 --- #### 父子组件通信 如果需要在父组件和子组件之间传递数据或事件,则可以利用 props 和自定义事件完成通信[^4]。 ##### 示例代码:父子组件通信 **ParentComponent.vue** ```vue <template> <div> <child-component :message="parentMessage" @custom-event="handleCustomEvent"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { data() { return { parentMessage: '来自父组件的消息', }; }, methods: { handleCustomEvent(data) { console.log('接收到子组件的数据:', data); }, }, components: { ChildComponent, }, }; </script> ``` **ChildComponent.vue** ```vue <template> <div> {{ message }} <button @click="sendDataToParent">发送消息给父组件</button> </div> </template> <script> export default { props: ['message'], methods: { sendDataToParent() { const eventData = '这是子组件发来的数据'; this.$emit('custom-event', eventData); }, }, }; </script> ``` 在这里,父组件向子组件传递了一个名为 `message` 的 prop,并监听了子组件发出的 `custom-event` 自定义事件。 --- ### 注意事项 1. **组件中的 Data 必须为函数式**: 如果在一个 Vue 组件中定义 `data` 配置项,那么它的值必须是一个函数而不是对象,以确保每个实例都有独立的状态副本[^1]。 2. **动态组件销毁行为**: 当动态组件发生切换时,默认会保留之前的 DOM 节点而不销毁它们。如果希望完全销毁旧组件,在 `<keep-alive>` 外部使用 `<component>` 即可。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值