Vue高频面试题整理-2

110 阅读5分钟

1、Vue中怎么自定义过滤器(vue3不支持)

通过filter来定义过滤器,过滤器分为全局和局部过滤器,过滤器的主体为一个普通的函数,来对数据进行处理,可以传递参数。当有局部和全局两个名称相同的过滤器时候,会以就近原则进行调用,即:局部过滤器优先于全局过滤器被调用。

 <!-- 在双花括号中 -->
 {{ message |  capitalize }}
 
 <!-- 在v-bind中 -->
 <div v-bind:id="rawId  formatId"></div>
 
 filters: {
  capitalize: function (value) [
    if (!value) return ""
    value = value .toString()
    return value.charAt(0).toUpperCase() + value.slice(1)
   }
 }
 
 Vue.filter('capitalize', function (value) {
   if (!value) return ""
   value = value.toString()
   return value.charAt(0).toUpperCase() + value.slice(1)
})
 

2、Vue单页面应用的优缺点

优点:

1、单页应用的内容的改变不需要重新加载整个页面,web应用更具响应性和更令人着迷。

2、单页应用没有页面之间的切换,就不会出现“白屏现象”,也不会出现假死并有“闪烁”现象。

3、单页应用相对服务器压力小,服务器只用出数据就可以,不用管展示逻辑和页面合成,吞吐能力会提高几倍。

4、良好的前后端分离。后端不再负责模板渲染、输出页面工作,后端API通用化,即同一套后端程序代码,不用修改就可以用于web界面、手机、平板等多种客户端。

缺点:

1、首次加载耗时比较多。

2、SEO问题,不利于百度,360等搜索引擎收录。

3、容易造成css命名冲突。

4、前进、后退、地址栏、书签等,都需要程序进行管理,页面的复杂度很高,需要一定的技能水平和开发成本高。

3、Vue-router 使用params与query传参有什么区别

用法上:

query要用path来引入,params要用name来引入,接收参数都是类似的,分别是 this.$route.querythis.$route.params

展示上:

params是路由的一部分,必须要有。query是拼接在url后面的参数。

1、命名的路由,并加上参数,让路由建立 url/users/eduardo

router.push({ name:'user', params: {username: 'eduardo'} })

2、带查询参数,结果是 /register?plan=private

router.push({ path:'/register', query: {plan: 'private'} })

3、带hash,结果是 /about#team

router.push({path:'/about', hash:'#team' })

4、Vue中 keep-alive 的作用

keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新染。一旦使用keepalive包裹组件,此时mouted,created等钩子函数只会在第一次进入组件时调用,当再次切换回来时将不会调用。此时如果我们还想在每次切换时做一些事情,就需要用到另外的周期函数,actived和deactived,这两个钩子函数只有被keepalive包裹后才会调用。

5、Vue如何实现单页面应用

通常的url 地址由以下内容构成:协议名 域名 端口号 路径 参数哈希值,当哈希值改变,页面不会发生跳转,单页面应用就是利用了这一点,给window注册onhashchange事件,当哈希值改变时通过location.hash就能获得相应的哈希值,然后就能跳到相应的页面。

1.hash通过监听浏览器的onhashchange()事件变化,查找对应的路由规则

2.history原理: 利用H5的 history中新增的两个API pushstate()和 replacestate() 和一个事件onpopstate监听URL变化

6、说出至少4种Vue当中的指令和它的用法?

  1. v-if(判断是否隐藏,用来判断元素是否创建)
  2. v-show(元素的显示隐藏,类似css中的display的block和hidden)
  3. v-for(把数据遍历出来)
  4. v-bind(绑定属性)
  5. v-model(实现双向绑定)

7、如何实现一个路径渲染多个组件?

可以通过命名视图(router-view),它容许同一界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果router-view 没有设置名字,那么默认为 default。通过设置components即可同时渲染多个组件。


<router-view class="view left-sidebar" name="Leftsidebar"></router-view>

<router-view class="view main-content"></router-view>

<router-view class="view right-sidebar" name="Rightsidebar"></router-view>


const router = createRouter({
    history: createwebHashHistory(),
    routes: [{
        path: '/',
        components: {
            default: Home,
            Leftsidebar,
            //Leftsidebar: Leftsidebar 的缩写
            //它们与 <router-view>上的 name 属性相配
            Rightsidebar
        }
    }]
})

8、如何实现多个路径共享一个组件?

只需将多个路径的component字段的值设置为同一个组件即可。


const routes = [

 { path:'/', component: Home },

 { path:'/home', component: Home }

]

9、如何监测动态路由的变化

可以通过watch方法来对$route进行监听,或者通过导航守卫的钩子函数beforeRouteupdate来监听它的变化。

10、vue-router 中的 router-link上v-slot属性怎么用?

router-link 通过一个作用域插槽暴露底层的定制能力。这是一个更高阶的 API,主要面向库作者,但也可以为开发者提供便利,多数情况用在一个类似 NavLink 这样的自定义组件里。

有时我们可能想把激活的 class 应用到一个外部元素而不是 a标签 本身,这时你可以在一个 router-link 中包裹该元素并使用 v-slot 属性来创建链接。

<router-link to="/foo" custom v-slot="{ href, route, navigate, isActive, isExactActive }">
   <li :class="[isActive && 'router-link-active', isExactActive && 'router-Tink-exact-active']">
      <a :href="href" @click="navigate">{{ route.fullpath }}</a>
   </li>
</router-link>

11、Vue如何除url中的#

将路由模式改为history。

由于我们的应用是一个单页的客户端应用,如果没有适当的服务器配置,用户在浏览器中直接访问example.com/user/id,就会得… 404 错误。这就尴尬了。

不用担心:要解决这个问题,你需要做的就是在你的服务器上添加一个简单的回退路由。如果 URL 不匹配任何静态资源,它应提供与你的应用程序中的 index.html 相同的页面。


var history = require('connect-history-api-fallback');
app.use(history({
    index: '/index.html'
})); //注意放在所有的接口后面

12、$route 和 $router 的区别

$route用来获取路由的信息的,它是路由信息的一个对象,里面包含路由的一些基本信息,包括name、meta、pathhash、query、params、fullPath、matched、redirectedFrom等。

而$router主要是用来操作路由的,它是VueRouter的实例,包含了一些路由的跳转方法push,go,replace,钩子函数等。

13、Vue路由守卫

vue-router 提供的导航守卫主要用来对路由的跳转进行监控,控制它的跳转或取消,路由守卫有全局的,单个路由独享的,或者组件级的。导航钩子有3个参数:

1、to:即将要进入的目标路由对象:

2、from:当前导航即将要离开的路由对象;

3、next : 调用该方法后,才能进入下一个钩子函数 (afterEach)。


router.beforeEach(async (to, from) => {
    if (
        //检查用户是否已登录
        !isAuthenticated && to.name !== 'Login'
        //避免无限重定向
    ) {
        //将用户重定向到登录页面
        return {
            name: 'Login'
        }
    }
})

14、Vue路由实现的底层原理

在Vue中利用数据劫持defineproperty在原型prototype上初始化了一些getter,分别是router代表当前Router的实例 、 route 代表当前Router的信息。在install中也全局注册了router-view,router-link,其中的vue,util,defineReactive,这是Vue里面观察者劫持数据的方法,劫持 route,当_route触发setter方法的时候,则会通知到依赖的组件。

接下来在init中,会挂载判断是路由的模式,是history或者是hash,点击行为按钮,调用hashchange或者popstate的同时更_route,_route的更新会触发route-view的重新渲染。

写在最后

码字不易,谢谢关注、点赞和转发。

越笨拙,越努力; 越努力,越幸运; 大家加油!