vue 中 method、attribute、event的区别(以elemntui为例)

本文解析了后端开发者如何从DOM元素角度理解Element UI组件,涵盖了attribute(属性)、method(方法调用)和event(事件处理)的应用实例,通过el-input详解Vue组件交互方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为一个后端选手,在阅读element ui文档时总是对附录的感到疑惑,可能是我对前端不太熟,总觉得一个组件怎么也有method、attribute 并且event 又是什么,其实可以将vue中的组件都看成一个对象,官方术语应该是叫dom元素,下面介绍以el-input元素为例进行三种属于的介绍:

attribute

attriobute:这个很简单,也就是在标签中可以直接定义的一个东西
在这里插入图片描述
上面是input 的attribute,比如可以使用diable属性对输入框进行锁定:
<el-input disabled></el-input>在这里插入图片描述

method

的用法,可以通过父组件传给子组件的方法

app.vue

<template>
<!--  <img alt="Vue logo" src="./assets/logo.png">-->
<!--  <HelloWorld msg="Welcome to Your Vue.js App"/>-->
  <el-input v-model="input" placeholder="Please input" ref="input" />
  <el-button @click="say">聚焦</el-button>
</template>

script

  methods: {
    say(){
      this.$.refs.input.focus()
    }
  }

可以使用ref对组件中的dom元素使用focus,实现的效果就是点击按钮就会对输入框进行聚集焦点。

event

事件就像是一个触发器,当某些情况发生时会产生部分操作,比如input的事件有以下这些
在这里插入图片描述
现在对input输入框加入input事件,当输入改变时产生部分操作。
示例:
在这里插入图片描述

app.vue

<template>
<!--  <img alt="Vue logo" src="./assets/logo.png">-->
<!--  <HelloWorld msg="Welcome to Your Vue.js App"/>-->
  <el-input v-model="input" placeholder="Please input" ref="input" v-on:input="add" />
  <el-p>{{ message }}</el-p>
  <el-button @click="say">聚焦</el-button>
</template>

script

  data(){
    return {
      message:''
    }
  },
  methods: {
    say(){
      this.$.refs.input.focus()
    },
    add(){
      this.message=this.message+'1'
    }
  }
  

示例在这里插入图片描述

<think>好的,我现在需要回答用户关于Vue组件间通信方式的问题。用户已经提供了一些站内引用,我需要结合这些内容来组织回答。首先,我要回忆常见的Vue组件通信方法,然后根据用户提供的引用补充具体细节。 首先,组件间通信主要有父子组件、兄弟组件、跨层级组件等不同情况。常见的方法包括props/$emit,这是最基础的父子通信方式。父组件通过props传递数据给子组件,子组件通过$emit触发事件,父组件监听这些事件来更新数据。这部分应该没问题,用户提供的引用里没有提到这个,但这是基础,必须包括。 接下来是$parent$children属性。引用1提到通过$parent$refs来访问父组件或子组件,进而实现通信。比如父组件可以作为中间人让兄弟组件通信。这点需要注意,可能需要详细说明如何使用$refs来获取子组件实。 然后是事件总线(Event Bus)。创建一个空的Vue作为中央事件总线,不同组件通过$on$emit来监听触发事件。这种方法适合非父子组件间的通信,但可能在大型项目中难以维护,需要提及优缺点。 Vuex是官方推荐的状态管理库,适用于复杂应用。引用2中的代码示展示了如何创建store,定义state、mutationsactions。需要说明Vuex的工作流程,比如组件通过dispatch actions来提交mutations修改state,从而实现全局状态管理。这里需要详细解释Vuex的核心概念,如state、mutations、actions、getters,以及如何在不同组件中使用它们。 另外,还有provide/inject,这对API用于祖先组件向后代组件注入依赖,适合跨层级通信,但应谨慎使用,因为会导致组件间的耦合性增强。用户提供的引用里没有提到这个,但这也是重要的方法,应该补充。 此外,$attrs$listeners在Vue 2.4+中引入,用于跨级组件通信。$attrs包含父组件中未被props识别的特性,$listeners包含父组件中的v-on事件监听器。子组件可以通过v-bind="$attrs"v-on="$listeners"传递这些属性事件,这对于创建高阶组件很有用。 还有localStorage或sessionStorage,虽然不是Vue特有的,但可以用来在组件间共享数据,不过需要注意数据持久化响应式的问题,可能需要配合Vue的响应式系统使用。 现在需要根据用户提供的引用补充相关内容。引用1提到使用$parent$refs实现兄弟组件通信,以及任意组件间通信,这可能是指通过父组件作为桥梁,或者使用事件总线等其他方式。引用2详细说明了Vuex的实现方式,包括store的创建、mutationsactions的使用,这部分需要详细展开。 在组织回答时,应该分点列出每种方法,简要说明其适用场景实现方式,并给出代码示如,在讲到Vuex时,可以引用用户提供的代码示,说明如何定义store并在组件中使用它。同时,要注意用户提到的引用标识,如[^1][^2],在相关内容后添加。 需要确保回答结构清晰,符合用户要求的格式,使用中文,并正确应用LaTeX格式。同时,生成相关问题,可能需要包括不同方法的比较、Vuex的详细使用、事件总线的替代方案等。 最后,检查是否有遗漏的方法,如provide/inject$attrs/$listeners,确保覆盖主要的通信方式,并正确引用用户提供的资料。可能还需要注意代码示的正确性,比如用户提供的Vuex示是否正确,是否需要调整或补充说明。</think>### Vue组件间通信方法及实现 Vue组件间通信方式根据组件层级关系可分为多种模式,以下是七种常用方法及具体实现: --- #### 1. **Props/$emit(父子组件通信)** - **适用场景**:父组件向子组件传递数据,子组件通过事件向父组件传递数据。 - **实现**: - 父组件通过`props`传递数据: ```html <!-- 父组件 --> <ChildComponent :message="parentMessage" @update="handleUpdate"/> ``` - 子组件通过`$emit`触发事件: ```javascript // 子组件 this.$emit('update', newValue); ``` --- #### 2. **$parent/$refs(父子或兄弟组件通信)** - **适用场景**:直接访问父组件或子组件实。 - **实现**: - 父组件通过`$refs`访问子组件: ```javascript this.$refs.childComponent.methodName(); ``` - 子组件通过`$parent`访问父组件: ```javascript this.$parent.parentData = newValue; // 直接修改父组件数据 ``` - **兄弟组件通信**:通过父组件作为中间人,结合`$refs`实现。 --- #### 3. **事件总线(Event Bus)** - **适用场景**:任意组件间通信,适合小型项目。 - **实现**: ```javascript // 创建事件总线实 const bus = new Vue(); // 组件A触发事件 bus.$emit('custom-event', data); // 组件B监听事件 bus.$on('custom-event', (data) => { ... }); ``` --- #### 4. **Vuex(全局状态管理)** - **适用场景**:复杂应用中的跨组件状态共享。 - **核心概念**: - **State**:存储全局状态。 - **Mutations**:同步修改状态。 - **Actions**:异步提交Mutations。 - **实现**: ```javascript // store/index.js export default new Vuex.Store({ state: { message: 'Hello' }, mutations: { updateMessage(state, newMessage) { state.message = newMessage; } }, actions: { setMessage({ commit }, newMessage) { commit('updateMessage', newMessage); } } }); ``` - 组件中调用: ```javascript this.$store.dispatch('setMessage', 'New Message'); // 触发Action this.$store.state.message; // 读取State ``` - 引用示代码见。 --- #### 5. **provide/inject(祖先-后代通信)** - **适用场景**:跨层级组件数据传递。 - **实现**: ```javascript // 祖先组件 export default { provide() { return { theme: 'dark' }; } } // 后代组件 export default { inject: ['theme'] } ``` --- #### 6. **$attrs/$listeners(跨级组件通信)** - **适用场景**:透传未被`props`接收的属性事件。 - **实现**: ```html <!-- 父组件 --> <Child v-bind="$attrs" v-on="$listeners"/> <!-- 子组件通过$attrs访问未声明的属性 --> <div>{{ $attrs.attributeName }}</div> ``` --- #### 7. **LocalStorage/SessionStorage** - **适用场景**:持久化数据共享。 - **注意**:需手动触发响应式更新。 ```javascript // 存储数据 localStorage.setItem('key', JSON.stringify(data)); // 读取数据 JSON.parse(localStorage.getItem('key')); ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值