No17.精选前端面试题,享受每天的挑战和学习

简介: No17.精选前端面试题,享受每天的挑战和学习

说下ref 和 reactive 异同点

refreactive 都是 Vue 3 中用于创建响应式数据的函数,但它们在使用和行为上有一些异同点。

异同点如下:

  1. 数据类型:
  • ref 可以将基本类型(如字符串、数字、布尔值等)转换为响应式数据。使用 ref 创建的变量实际上是一个包装过的对象,需要通过 .value 属性来访问和更新值。
  • reactive 可以将普通对象转换为响应式数据。使用 reactive 创建的变量直接可以访问和更新值。
  1. 访问和更新:
  • 使用 ref 创建的变量需通过 .value 属性来访问和更新值。例如,const count = ref(0); console.log(count.value); count.value = 1;
  • reactive 创建的变量直接可以访问和更新值。例如,const state = reactive({ count: 0 }); console.log(state.count); state.count = 1;
  1. 自动包装和解包装:
  • ref 会自动包装和解包装基本类型的值。这意味着你可以直接将 ref 对象用于模板中,无需手动访问 .value 属性。例如,在模板中使用 {{ count }} 而不是 {{ count.value }}
  • reactive 不会自动包装和解包装对象的属性。如果你要在模板中使用 reactive 对象,需要访问其属性时要显式地使用 . 操作符。例如,在模板中使用 {{ state.count }}
  1. 嵌套对象的处理:
  • ref 使用 reactive 内部进行嵌套。这意味着在 ref 中创建的对象属性也是响应式的。例如,const obj = ref({ count: 0 }); obj.value.count = 1;
  • reactive 会递归地将所有属性转换为响应式数据。这意味着在 reactive 中创建的对象的所有属性都是响应式的。例如,const state = reactive({ obj: { count: 0 } }); state.obj.count = 1;

总之,refreactive 都是用于创建响应式数据的函数,但它们在使用方式、访问和更新方式以及对嵌套对象的处理上有一些不同。在选择使用哪个函数时,你可以根据具体情况和需求来决定使用哪个函数更加合适。

说下pinia

Pinia 是一个由 Vue.js 官方推荐的状态管理库,它专为 Vue 3 设计。Pinia 提供了类似于 Vuex 的功能,但具有更好的 TypeScript 支持和更简洁的 API。

使用 Pinia,你可以轻松地在 Vue 3 应用程序中进行状态管理,并利用 TypeScript 的类型推断、智能提示和编译时错误检查等功能。

以下是使用 Pinia 的示例:

  1. 安装 Pinia:
npm install pinia
  1. 创建并配置 Pinia 实例:
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';
const app = createApp(App);
const pinia = createPinia();
app.use(pinia);
app.mount('#app');
  1. 创建 store 和定义状态:
import { defineStore } from 'pinia';
interface CounterState {
  count: number;
}
export const useCounterStore = defineStore('counter', {
  state: (): CounterState => ({
    count: 0,
  }),
  actions: {
    increment() {
      this.count++;
    },
    decrement() {
      this.count--;
    },
  },
});
  1. 在组件中使用 store:
<template>
  <div>
    <p>Count: {{ $store.counter.count }}</p>
    <button @click="$store.counter.increment()">Increment</button>
    <button @click="$store.counter.decrement()">Decrement</button>
  </div>
</template>
<script>
import { defineComponent } from 'vue';
import { useCounterStore } from './store';
export default defineComponent({
  setup() {
    const counterStore = useCounterStore();
    return { $store: counterStore };
  },
});
</script>

在上面的示例中,我们使用 Pinia 创建了一个名为 counter 的 store,并在组件中使用 useCounterStore 函数访问该 store 的实例。

总结来说,Pinia 是一个支持 TypeScript 的状态管理库,它提供了类似于 Vuex 的功能,并且与 Vue 3 配合得很好。通过使用 Pinia,你可以享受到更好的类型安全性和更简洁的 API,使得状态管理变得更加高效和可靠。

vuex在技术层面上的缺点

尽管 Vuex 是一个强大且广泛使用的状态管理库,但在技术层面上仍然存在一些缺点。以下是一些常见的 Vuex 缺点:

  1. 学习曲线:Vuex 作为一个独立的状态管理库,需要单独学习和理解其概念、API 和工作原理。对于新手开发者来说,可能需要投入一定的时间和精力来掌握 Vuex 的使用方法。
  2. 冗余的繁文缛节:Vuex 在一些简单的应用场景下可能显得过于复杂和冗余。对于小型应用程序,使用 Vuex 可能会增加额外的工作量和代码复杂性,而并没有明显的收益。
  3. 文件结构复杂:随着应用程序的增长,Vuex 的文件结构可能会变得庞大和复杂。在大型项目中,需要维护多个模块、状态和相关的操作,这可能导致文件数量和层级增加,使得代码更难以理解和维护。
  4. 命名空间管理:Vuex 允许创建模块命名空间来隔离不同模块的状态和操作。然而,管理命名空间需要额外的注意,因为在不正确使用的情况下,可能会导致模块之间的状态共享和冲突。
  5. 状态变更追踪:Vuex 使用了响应式的状态追踪机制,以便在组件中检测状态的变更并更新相应的视图。但对于某些特定场景,如多个组件共享同一状态时,可能导致过度更新和性能损失。
  6. 耦合性:使用 Vuex 可能会引入一定程度的耦合性,因为所有的状态都集中在一个地方。这可能使得代码难以移植、重构或测试。同时,Vuex 的使用还取决于 Vue.js 框架,不易与其他前端框架或库集成。

需要注意的是,这些缺点不一定适用于所有情况。对于大型复杂的应用程序或需要共享状态的多个组件,Vuex 仍然是一个强大且有用的工具。然而,对于简单的应用程序或个人项目,可能可以考虑使用更轻量级的状态管理解决方案或避免引入额外的状态管理库。

Vue 中如何扩展一个组件

在 Vue 中扩展一个组件有多种方式,以下是几种常见的方法:

  1. 继承方式:
    创建一个新的组件,并继承原始组件(父组件)的功能和属性。可以使用 extends 配置项来实现组件的继承。例如:
// 原始组件
<template>
  <div>
    <p>这是原始组件</p>
    <button @click="handleClick">点击</button>
  </div>
</template>
<script>
export default {
  methods: {
    handleClick() {
      console.log('原始组件点击');
    }
  }
}
</script>
// 扩展组件
<template>
  <div>
    <p>这是扩展组件</p>
    <OriginalComponent />
  </div>
</template>
<script>
import OriginalComponent from './OriginalComponent.vue';
export default {
  extends: OriginalComponent
}
</script>
  1. 混入方式:
    创建一个混入对象,包含要扩展到组件中的选项和逻辑。然后在组件中使用 mixins 配置项将混入对象应用到组件中。例如:
// 混入对象
const myMixin = {
  methods: {
    handleClick() {
      console.log('混入方法');
    }
  }
}
// 组件
<template>
  <div>
    <p>这是组件</p>
    <button @click="handleClick">点击</button>
  </div>
</template>
<script>
import myMixin from './myMixin';
export default {
  mixins: [myMixin],
}
</script>
  1. 插槽方式:
    使用插槽可以在父组件中扩展子组件的内容。子组件可以定义一个或多个插槽,并在父组件中使用相应的插槽内容进行扩展。例如:
// 子组件
<template>
  <div>
    <slot></slot>
    <p>这是子组件</p>
  </div>
</template>
// 父组件
<template>
  <div>
    <ChildComponent>
      <p>这是父组件中的插槽内容</p>
    </ChildComponent>
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent
  }
}
</script>

这些方法可以根据具体需求选择使用。继承方式适用于需要继承和修改原始组件的全部功能的情况;混入方式适用于在多个组件之间共享一些逻辑和选项的情况;插槽方式适用于在父组件中直接嵌入和扩展子组件的内容的情况。根据实际需求,选择合适的扩展方式可以更好地组织和重用 Vue 组件。

怎么定义动态路由,怎么获取传过来的动态参数

在 Vue Router 中,可以通过动态路由来定义包含参数的路由,并且可以获取传递过来的动态参数。下面是如何定义动态路由和获取参数的示例:

  1. 定义动态路由:
    在路由配置中,使用冒号(:)表示参数的位置,并为参数指定一个名称。例如,要定义一个包含参数的动态路由,可以使用以下方式:
const router = new VueRouter({
  routes: [
    {
      path: '/user/:id',
      component: UserComponent
    }
  ]
});
  1. 在上面的例子中,路由 /user/:id 中的 :id 表示一个名为 id 的动态参数。
  2. 获取传递的动态参数:
    在组件中,可以通过 $route.params 来获取传递过来的动态参数。例如,在上述示例中的 UserComponent 组件中可以通过以下方式获取 id 参数:
export default {
  mounted() {
    const id = this.$route.params.id;
    console.log(id); // 输出传递过来的动态参数
  }
};
  1. 上述代码中,在组件的生命周期钩子 mounted 中通过 this.$route.params.id 获取传递的动态参数,并将其保存在 id 变量中进行后续处理。

需要注意的是,在组件内部实时监测动态参数变化并不会触发组件的重新渲染。如果需要在动态参数发生变化时重新渲染组件,请使用 Vue 的响应式数据或侦听 $route 对象的变化。

以上是定义动态路由和获取传递的动态参数的基本方法。通过使用动态路由和获取参数,可以在应用程序中实现更灵活和动态的路由配置。


相关文章
|
1月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
43 0
|
17天前
|
前端开发 开发者 C++
独家揭秘:前端大牛们如何高效学习新技术,保持竞争力!
【10月更文挑战第31天】前端技术飞速发展,如何高效学习新技术成为关键。本文通过对比普通开发者与大牛们的策略,揭示了高效学习的秘诀:明确目标、主动探索、系统资源、实践应用和持续学习。通过这些方法,大牛们能更好地掌握新技术,保持竞争力。示例代码展示了如何通过实践加深理解。
36 4
|
1月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
33 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
26天前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
61 1
|
1月前
|
Java 应用服务中间件 程序员
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
这篇文章通过多个案例深入探讨了Java虚拟机(JVM)中的内存溢出问题,涵盖了堆内存、方法区、直接内存和栈内存溢出的原因、诊断方法和解决方案,并讨论了不同JDK版本垃圾回收器的变化。
30 4
|
2月前
|
Web App开发 前端开发 Linux
「offer来了」浅谈前端面试中开发环境常考知识点
该文章归纳了前端开发环境中常见的面试知识点,特别是围绕Git的使用进行了详细介绍,包括Git的基本概念、常用命令以及在团队协作中的最佳实践,同时还涉及了Chrome调试工具和Linux命令行的基础操作。
「offer来了」浅谈前端面试中开发环境常考知识点
|
1月前
|
JavaScript 前端开发 Java
VUE学习四:前端模块化,ES6和ES5如何实现模块化
这篇文章介绍了前端模块化的概念,以及如何在ES6和ES5中实现模块化,包括ES6模块化的基本用法、默认导出与混合导出、重命名export和import,以及ES6之前如何通过函数闭包和CommonJS规范实现模块化。
85 0
VUE学习四:前端模块化,ES6和ES5如何实现模块化
|
1月前
|
前端开发 JavaScript 小程序
前端新机遇!为什么我建议学习鸿蒙?
【10月更文挑战第4天】前端新机遇!为什么我建议学习鸿蒙?
113 0
前端新机遇!为什么我建议学习鸿蒙?
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
126 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
1月前
|
Web App开发 JavaScript 前端开发
前端Node.js面试题
前端Node.js面试题
下一篇
无影云桌面