Vue组件的实例里面常见的都有什么?

本文深入探讨Vue.js的关键特性,包括数据绑定、计算属性、生命周期钩子、自定义指令等,通过具体代码示例解释如何使用这些特性来构建响应式用户界面。

 每个export default里都有很多方法,今天复习了常用的一些。


数据相关的有:

包括props、data状态,自定义方法,计算属性,监听。

<template>
  <div>
    <div>路由传递参数{{id}}</div>
    <div @click="show">控制台打印</div>
    <div>计算属性{{add}}</div>
    <Nav />
  </div>
</template>

<script>
export default {
  //外部状态:接收外部参数  props: ['id']
  props: { id: String },

  //内部状态:组件内部数据
  data() {
    return {
      a: 1,
      b: 2,
      c: {
        d: 1
      }
    };
  },

  //自定义方法
  methods: {
    show() {
      console.log("打印");
      this.c = {
        d: 3
      };
    }
  },

  //计算属性 与计算相关,返回最后计算出来的值,相关依赖发生改变时才会重新取值,提高性能
  computed: {
    add() {
      return this.a + this.b;
    }
  },

  //监听实例上表达式或函数计算结果的变化
  watch: {
    //检测a是否发生了变化 发生变化执行aChange函数
    id: "idChange",
    "c.d": {
      handler(newName, oldName) {
        console.log(newName, oldName);
        //newName 当前值, oldName 原来的值
      },
      //让d的值未改变时候watch就执行
      immediate: true,
      //深度监听
      deep: true
    }
  }
}
</script>

生命周期钩子相关的有:

这8个是比较常用的,可以概括为实例前后,挂载前后,状态更新前后,销毁前后。

export default {
  //生命周期钩子
  beforeCreate() {
    //初始化实例前
  },
  created() {
    //实例创建完成
  },
  beforeMount() {
    //虚拟dom挂载到正式dom前
  },
  mounted() {
    //挂载到正式dom完成
  },
  beforeUpdate() {
    //虚拟dom重新渲染前,更新props、data时
  },
  updated() {
    //props、data更改后
  },
  beforeDestroy() {
    //实例销毁前
  },
  destroyed() {
    //实例销毁完成
  }
}


资源类相关的有:

包括过滤器、组件注册、自定义指令

<template>
  <div>
    <input v-focus:[id]="{a:1,b:2}" />
    <div>{{value|addPriceIcon}}</div>
    <Nav />
  </div>
</template>

<script>
import Nav from "./Nav";
export default {
  data() {
    return {
      id: "text",
      value: "100"
    };
  },
  //组件注册
  components: { Nav },

  //局部过滤器
  filters: {
    //处理函数
    addPriceIcon(value) {
      return "¥" + value;
    }
  },

  //组件内自定义指令
  directives: {
    focus: {
      bind(el, binding, vnode) {
        //el 指令所绑定的元素
        //binding  一个包含指令信息的对象   binding.arg: [id]   binding.value:等号后的值
        //vnode 虚拟节点
        console.log(el, binding, vnode);
        //指令第一次绑定到元素时调用,只调用一次,一般用来进行一次性的初始化设置
      },
      inserted(el) {
        //被绑定元素插入父节点时调用
        el.focus();
      },
      update() {
        //所在组件的虚拟节点更新时调用
      },
      componentUpdated() {
        //所在组件的虚拟节点全部更新后调用
      },
      unbind() {
        //只调用一次,指令与元素解绑时调用
      }
    }
  }
};
</script>

扩展:全局注册自定义指令和过滤器的方法

Vue.filter('capitalize', function (value) { })

Vue.directive('focus', {
  inserted: function (el) {
    el.focus()
  }
})

Vue 组件通信是指在 Vue 应用中不同组件之间进行数据传递和消息交互的方式。除了使用 Vuex 外,常见组件通信方法如下: ### props / $emit - **props**:用于父组件向子组件传递数据。在父组件中,通过在子组件标签上绑定属性来传递数据;在子组件中,通过 `props` 选项来接收这些数据。 ```vue <!-- 父组件 --> <template> <child-component :message="parentMessage"></child-component> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentMessage: 'Hello from parent' }; } }; </script> <!-- 子组件 --> <template> <div>{{ message }}</div> </template> <script> export default { props: ['message'] }; </script> ``` - **$emit**:用于子组件向父组件发送消息。子组件通过调用 `$emit` 方法触发一个自定义事件,并传递数据;父组件通过 `v-on` 指令监听这个事件并处理数据。 ```vue <!-- 子组件 --> <template> <button @click="sendMessage">Send Message to Parent</button> </template> <script> export default { methods: { sendMessage() { this.$emit('child-event', 'Hello from child'); } } }; </script> <!-- 父组件 --> <template> <child-component @child-event="handleChildEvent"></child-component> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, methods: { handleChildEvent(message) { console.log(message); } } }; </script> ``` ### $parent / $children - **$parent**:子组件可以通过 `$parent` 访问其父组件实例,从而直接调用父组件的方法或访问其数据。 ```vue <!-- 子组件 --> <template> <button @click="callParentMethod">Call Parent Method</button> </template> <script> export default { methods: { callParentMethod() { this.$parent.parentMethod(); } } }; </script> <!-- 父组件 --> <template> <child-component></child-component> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, methods: { parentMethod() { console.log('Parent method called'); } } }; </script> ``` - **$children**:父组件可以通过 `$children` 访问其所有子组件实例数组,从而调用子组件的方法或访问其数据。不过,`$children` 并不保证子组件的顺序。 ### $refs 在父组件中,可以通过 `ref` 为子组件添加引用标识,然后通过 `$refs` 访问子组件实例。 ```vue <!-- 父组件 --> <template> <child-component ref="childRef"></child-component> <button @click="callChildMethod">Call Child Method</button> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, methods: { callChildMethod() { this.$refs.childRef.childMethod(); } } }; </script> <!-- 子组件 --> <template> <div>Child Component</div> </template> <script> export default { methods: { childMethod() { console.log('Child method called'); } } }; </script> ``` ### event bus(事件总线) 事件总线是一个全局的事件中心,用于在任意组件之间传递消息。可以创建一个空的 Vue 实例作为事件总线,组件通过 `$emit` 触发事件,通过 `$on` 监听事件。 ```javascript // event-bus.js import Vue from 'vue'; export const eventBus = new Vue(); ``` ```vue <!-- 发送消息的组件 --> <template> <button @click="sendMessage">Send Message</button> </template> <script> import { eventBus } from './event-bus.js'; export default { methods: { sendMessage() { eventBus.$emit('custom-event', 'Hello from sender'); } } }; </script> <!-- 接收消息的组件 --> <template> <div></div> </template> <script> import { eventBus } from './event-bus.js'; export default { created() { eventBus.$on('custom-event', (message) => { console.log(message); }); } }; </script> ``` ### Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 ```javascript // store.js import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++; } }, actions: { incrementAsync({ commit }) { setTimeout(() => { commit('increment'); }, 1000); } }, getters: { getCount(state) { return state.count; } } }); ``` ```vue <!-- 组件中使用 Vuex --> <template> <div> <p>{{ count }}</p> <button @click="increment">Increment</button> </div> </template> <script> import { mapState, mapMutations } from 'vuex'; export default { computed: { ...mapState(['count']) }, methods: { ...mapMutations(['increment']) } }; </script> ``` ### provide / inject `provide` 和 `inject` 主要用于实现跨级组件之间的通信。父组件通过 `provide` 选项提供数据,子组件通过 `inject` 选项注入这些数据。 ```vue <!-- 父组件 --> <template> <child-component></child-component> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, provide: { message: 'Hello from ancestor' } }; </script> <!-- 子组件 --> <template> <div>{{ injectedMessage }}</div> </template> <script> export default { inject: ['message'], computed: { injectedMessage() { return this.message; } } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

花贝是只猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值