展现自己小技能

330 阅读8分钟

技能二十六 自定义组件上正确使用v-model和sync

前端自定义组件中,v-modelsync 用于实现父子组件之间的双向数据绑定。它们可以简化组件间数据的传递和同步更新。下面我将分别说明如何在自定义组件上正确使用 v-modelsync

下载.png1. 使用 v-model

  • 在父组件中,使用 v-model 指令绑定一个变量和自定义组件的属性,同时监听 input 事件来更新父组件的数据。 - 在自定义组件中,接受 value 属性作为父组件传递的数据,并在需要修改数据的地方,使用 $emit 方法触发 input 事件来更新父组件的数据。

下载.png 父组件模板:

<template>
  <div>
    <custom-component v-model="data"></custom-component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      data: ''
    }
  }
}
</script>

下载.png自定义组件模板:

<template>
  <div>
    <input :value="value" @input="$emit('input', $event.target.value)" />
  </div>
</template>

<script>
export default {
  props: ['value']
}
</script>

在上述示例中,data 是父组件中的数据,通过 v-model 绑定到自定义组件上。在自定义组件中,使用 value 属性接受父组件传递的数据,并在输入框中使用 :value 绑定该属性。当输入框的值发生变化时,通过 $emit('input', $event.target.value) 触发 input 事件来更新父组件的数据。

下载.png2. 使用 sync

  • 在父组件中,使用 :value 绑定自定义组件的属性,并使用 @update:value 监听事件来更新父组件的数据。 - 在自定义组件中,接受 value 属性作为父组件传递的数据,并在需要修改数据的地方,通过 $emit('update:value', newValue) 触发 update:value 事件来更新父组件的数据。

下载.png父组件模板:

<template>
  <div>
    <custom-component :value.sync="data"></custom-component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      data: ''
    }
  }
}
</script>

下载.png自定义组件模板:

<template>
  <div>
    <input :value="value" @input="$emit('update:value', $event.target.value)" />
  </div>
</template>

<script>
export default {
  props: ['value']
}
</script>

下载.png 在上述示例中,data 是父组件中的数据,通过 :value.sync 绑定到自定义组件上。在自定义组件中,使用 value 属性接受父组件传递的数据,并在输入框中使用 :value 绑定该属性。当输入框的值发生变化时,通过 $emit('update:value', $event.target.value) 触发 update:value 事件来更新父组件的数据。

使用 v-modelsync 都能够实现父子组件之间的双向数据绑定,具体选择哪种方式取决于个人偏好和项目要求。

技能二十七 清晰准确描述v-model和sync的区别

v-modelsync 都是用于实现父子组件之间的双向数据绑定,但它们在用法和实现上有一些区别:

下载.png1. v-model

  • v-model 是 Vue.js 提供的一个语法糖,用于简化父子组件之间的双向数据绑定。 - 在父组件中,使用 v-model 指令将一个变量与子组件的属性进行绑定,并监听子组件触发的 input 事件来更新父组件的数据。 - 在子组件中,接受一个名为 value 的属性作为父组件传递的数据,并在需要修改数据的地方,通过 $emit('input', newValue) 触发 input 事件来更新父组件的数据。

下载.png2. sync

-   `sync` 是 Vue.js 提供的一种自定义修饰符,用于实现父子组件之间的双向数据绑定。
-   在父组件中,使用 `:value.sync` 语法将一个变量与子组件的属性进行绑定,并监听子组件触发的 `update:value` 事件来更新父组件的数据。
-   在子组件中,接受一个名为 `value` 的属性作为父组件传递的数据,并在需要修改数据的地方,通过 `$emit('update:value', newValue)` 触发 `update:value` 事件来更新父组件的数据。

主要区别:

  • v-model 是一个语法糖,使用简单,但只能将父组件的数据绑定到子组件的 value 属性上,适用于常规的输入表单元素等场景。
  • sync 是一个自定义修饰符,使用稍微复杂,但可以将父组件的数据绑定到子组件的任意属性上,并通过自定义事件进行更新,适用于更灵活的数据绑定场景。

总结:v-model 是一种更为简单和常见的双向数据绑定方式,适用于常规的输入表单元素;而 sync 则提供了更大的灵活性,可以用于自定义组件的任意属性的双向数据绑定。

技能二十八 准确描述v-if 和 v-show的区别

v-ifv-show 是 Vue.js 中用于条件渲染的指令,它们的主要区别在于渲染的方式和性能表现:

下载.png1. v-if

  • v-if 是惰性渲染的指令,它根据条件是否满足来决定是否渲染元素及其子组件。 - 当条件为 false 时,元素及其子组件会被完全销毁,并且在条件变为 true 时重新创建和渲染。 - v-if 在条件切换时会触发条件块内的生命周期钩子函数(如 createdmounted 等)和组件的重新渲染,适用于需要在条件变化时执行较复杂的逻辑操作的场景。 - 由于销毁和重新创建的过程,v-if 在切换频繁的情况下,有较高的切换性能消耗。

下载.png2. v-show

  • v-show 是通过 CSS 控制元素的显示和隐藏,而不是直接销毁和重新创建元素及其子组件。 - 当条件为 false 时,元素会被设置为 display: none,而当条件为 true 时,元素会重新设置为原来的显示状态。 - v-show 在条件切换时不会触发条件块内的生命周期钩子函数和组件的重新渲染,适用于需要频繁切换条件而保持较好性能的场景。 - 由于只是通过 CSS 控制显示和隐藏,元素始终保留在 DOM 中,因此在初始渲染时有一定的性能开销。

总结:

  • 使用 v-if 进行条件渲染时,元素及其子组件的销毁和重新创建带来了较高的性能开销,适用于条件变化较少的场景。
  • 使用 v-show 进行条件渲染时,元素始终保留在 DOM 中,只是通过 CSS 控制显示和隐藏,适用于条件频繁切换且需要较好性能的场景。
  • 如果需要在条件变化时执行较复杂的逻辑操作或需要较好的性能表现,可以根据具体情况选择使用 v-ifv-show

技能二十九 合理拆分store并配置全局getter

前端应用中,合理拆分和组织 Vuex(或其他状态管理库)的 store 是一种良好的实践,可以提高代码的可维护性和扩展性。同时,配置全局的 getter 可以方便地获取和计算 store 中的数据。以下是一些步骤来合理拆分 store 并配置全局 getter:

下载.png1. 拆分 Store:

-   根据业务逻辑和模块的关系,将 Store 拆分为多个模块(modules)。
-   每个模块应该包含自己的状态(state)、行为(actions)、变更(mutations)和获取器(getters)等。
-   将相关的模块组合在一起,创建一个根级的 Store 对象。

下载.png2. 配置全局的 Getter:

-   在 Vuex 的配置中,定义一个全局的 getter,用于获取各个模块的数据。
-   在全局 getter 中,使用 `rootState` 参数获取根级的 state 对象,通过 `rootState.moduleName` 访问各个模块的状态。
-   可以根据需要在全局 getter 中对模块的数据进行计算或转换。

下面是一个示例,演示如何拆分 Store 并配置全局 getter:

// store.js
import Vue from 'vue';
import Vuex from 'vuex';
import moduleA from './modules/moduleA';
import moduleB from './modules/moduleB';

Vue.use(Vuex);

const store = new Vuex.Store({
  modules: {
    moduleA,
    moduleB,
  },
  getters: {
    // 全局 getter,用于获取各个模块的数据
    combinedData: (state, getters, rootState) => {
      const dataA = rootState.moduleA.data;
      const dataB = rootState.moduleB.data;
      
      // 对数据进行计算或转换
      return dataA + dataB;
    },
  },
});

export default store;

// modules/moduleA.js
const moduleA = {
  state: {
    data: 10,
  },
  mutations: {
    // mutations 和其他属性
  },
  actions: {
    // actions 和其他属性
  },
  getters: {
    // moduleA 的 getter
  },
};

export default moduleA;

// modules/moduleB.js
const moduleB = {
  state: {
    data: 20,
  },
  mutations: {
    // mutations 和其他属性
  },
  actions: {
    // actions 和其他属性
  },
  getters: {
    // moduleB 的 getter
  },
};

export default moduleB;

上述示例中,store.js 文件中配置了两个模块 moduleAmoduleB,并定义了一个全局的 getter combinedData,它通过 rootState 获取各个模块的数据,并可以对数据进行计算或转换。

通过合理拆分和组织 store,并配置全局的 getter,你可以更好地管理和获取应用程序的状态数据,并使代码更具可维护性和扩展性。

技能三十 清晰描述在组件中调用action发请求的流程

前端组件中调用 action 发送请求的流程可以分为以下几个步骤:

下载.png1. 定义 Action:在 Vuex 的 action 中定义一个函数,该函数将处理发送请求的逻辑。Action 函数可以接受一个 context 对象作为参数,其中包含了访问 state、commit mutation 和 dispatch action 等方法。

下载.png2. 组件中调用 Action:在组件中,通过使用 this.$store.dispatch('actionName', payload) 方法来触发指定的 action。其中,actionName 是要调用的 action 的名称,payload 是传递给 action 的参数,可以是一个对象或者其他类型的数据。

下载.png3. Action 发送请求:在 action 中,使用适当的方式(如使用 axios 或其他 HTTP 库)发送请求到后端服务器。可以根据需要设置请求的 URL、请求方法、请求头、请求体等参数。

下载.png4. 处理响应:一旦后端服务器返回响应,可以在 action 中对响应进行处理,如提取需要的数据、调用 mutation 更新 state 等操作。可以根据请求成功或失败的情况,采取不同的处理方式。

下载.png5. 更新状态:根据响应的结果,在 action 中使用 commit 方法来调用合适的 mutation,以更新 Vuex 的 state 中的数据。mutation 是用于修改 state 的同步操作,通过 commit 方法传递相关的参数。

下载.png6. 组件响应:组件中可以使用 computed 属性或通过映射辅助函数(如 mapState、mapGetters)来获取更新后的 state 数据,并在模板中进行渲染或执行其他操作。

总结: 在组件中调用 action 发送请求的流程包括定义 action、组件中调用 action、action 发送请求、处理响应、更新状态和组件响应。通过这个流程,你可以将异步操作(如请求)与状态管理分离,实现更好的代码组织和可维护性。

image.png