Vue 常用知识


let ,var ,const 之间的区别

var声明变量可以重复声明,而let不可以重复声明

const声明之后必须赋值,否则会报错
const定义不可变的量,改变了就会报错

const和let一样不会与window相映射、支持块级作用域

父子组件的传值

父组件传值给子组件:
第一步:在父组件中 v-bind:parentmsg=“父组件的data值”(parentmsg 这个名字可自定义)
第二步:在子组件中 **props:[‘parentmsg’] ** ,这样就可以使用 父组件的值

父组件把方法传递给子组件:
第一步:在父类组件中 @func=父组件方法名 (方法名不带‘()’,func可自定义)
第二步:在子组件方法中写 this.$emit(‘func’,方法参数) (func可自定义,无参方法‘方法参数’就别写)

路由跳转的方式

<router-link to='home'> router-link
router.push('/home')

vue-router 中 hash 模式和 history 模式的区别

最直观的区别是在 url 中 hash 带了一个 # 而 history 是没有的;

history 需要后端提供支持;
history 跳转后刷新或者回跳会报错

axios 怎样发送请求

get请求,参数是放到params属性中

//指定基本url默认配置
axios.defaults.baseURL = 'http://localhost:8888'
 
//默认是get请求方式,可以不用指定
axios({
    //这里的url路径是不能取消 / 的,因为路径必须带
    url: '/user',
    params:{
        id: 1
    }
}).then(response => {
                    console.log(response.data)
                    })

post一定要指定,注意数据是放在data属性中的,而不是params中

post一定要指定,注意数据是放在data属性中的,而不是params中

axios({
    url: '/user',
    method: 'post',//这里既可以大写也可以小写,最终底层代码中都会转为大写
    data: {
        "title": "js"
    }
})

计算属性(computed)和 watch 的区别

简单来说computed是计算值,只有值发生变化才会执行方法,watch是监听观察动作,有改变就执行

computed具有缓存性,数据变化时先读取缓存,值没变这不做操作,而watch没有缓存直接执行

Get 请求和 Post 请求的区别

Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。

Get传送的数据量较小,这主要是因为受URL长度限制;Post传送的数据量较大,一般被默认为不受限制

Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。

Get执行效率却比Post方法好。Get是form提交的默认方法。

列举css 选择器及优先级

  1. html标记选择器。

    指用html的标记语言作为选择器, 如:p{}、 b{}、 h1 { } 等等。

  2. id选择器。

    id选择器是指用指定的id name作为选择器。 例如 如果要选择id=“one”的元素,选择器就是: #one { }。

  3. 选择器。

    类选择器是指用一个类(class)的name来作为选择器。 例如,b元素和p元素都被归为“two”类(class=“two”)的话,选择器就是: .two { } /* 不能忘记前面的小点*/

  4. 组合选择器

    把多个元素组合在一起选择。p, b , h1 { } /标记之间用逗号/

  5. 关联选择器,

    是指用两个多个标记进行特定的选择。例如,p元素里面有a元素,p元素之外也有a元素,想特定选择p里面的a元素的话 就可以写选择器:p a { } /* 中间用空格隔开*/

  6. 伪类选择器。

    伪类只用于a元素和p元素。

单个标签的选择器中: id > class > 标签(如p{})

!important是无条件优先级,享有最高优先级,但是IE6不支持此属性。

直接在html给元素添加style的优先级位于第二高

最低一级的是用通配选择器。 *{ }。

当比较拥有相同级别的选择器的时候,定义的位置将决定一些。

简述 cookies sessionStorage 和 localStorage 区别

img

数组去重

一般的数组去重可以直接用 new Set() 方法即可,但是数组对象的话,比较复杂,不能直接用,我们可以采取间接的方法来去重

unique(arr) { //  arr为待去重的数组对象
 const res = new Map();
 return arr.filter((arr) => !res.has(arr.id) && res.set(arr.id, 1))
}

判断一个字符串中出现次数最多的字符,统计这个次数、

var str = 'asdfssaaasasasasaa';
var json = {};
for (var i = 0; i < str.length; i++) {
    if(!json[str.charAt(i)]){
       json[str.charAt(i)] = 1;
    }else{
       json[str.charAt(i)]++;
    }
};
var iMax = 0;
var iIndex = '';
for(var i in json){
    if(json[i]>iMax){
         iMax = json[i];
         iIndex = i;
    }
}        
console.log('出现次数最多的是:'+iIndex+'出现'+iMax+'次');

把URL参数解析为一个对象

http://www.baidu.com?key0=0&key1=1&key2=2
function parseQueryString(url) {
		   var params = {};
		   var arr = url.split("?");
		   if (arr.length <= 1) {
		      return params;
		   }
		   arr = arr[1].split("&");
		   for(var i = 0, l = arr.length; i < l; i++) {
		      var a = arr[i].split("=");
		      params[a[0]] = a[1];
		   }
		   return params;
	}

简述Vue的响应式原理

当一个Vue实例创建时,vue会遍历data选项的属性,用 Object.defineProperty 将它们转为getter/setter并且在内部追踪相关依赖,在属性被访问和修改时通知变化。

每个组件实例都有相应的watcher程序实例,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的setter被调用时,会通知watcher重新计算,从而致使它关联的组件得以更新。

Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决?

示例:

image-20210416124938831

image-20210416125002582

点击button会发现, obj.b 已经成功添加,但是视图并未刷新

原因在于在Vue实例创建时, obj.b 并未声明,因此就没有被Vue转换为响应式的属性,自然就不会触发视图的更新,这时就需要使用Vue的全局api—— $set():

addObjB () {
      // this.obj.b = 'obj.b'
      this.$set(this.obj, 'b', 'obj.b')
      console.log(this.obj)
    }

$set() 方法相当于手动的去把 obj.b 处理成一个响应式的属性,此时视图也会跟着改变了

如何优化SPA应用的首屏加载速度慢的问题?

将公用的JS库通过script标签外部引入,减小 app.bundel 的大小,让浏览器并行下载资源文件,提高下载速度;

在配置 路由时,页面和组件使用懒加载的方式引入,进一步缩小 app.bundel 的体积,在调用某个组件时再加载对应的js文件;

加一个首屏loading图,提升用户体验;

jQuery获取的dom对象和原生的dom对象有何区别?

js原生获取的dom是一个对象,jQuery对象就是一个数组对象

前端如何优化网站性能?

减少 HTTP 请求数量

控制资源文件加载优先级

利用浏览器缓存

减少重排(Reflow) 减少Reflow,如果需要在DOM操作时添加样式,尽量使用增加class属性,而不是通过style操作样式。

减少 DOM 操作

图标使用 IconFont 替换

key主要是解决哪一类的问题,为什么不建议用索引index(重绘)

key的作用主要是为了高效的更新虚拟DOM

当以index为key值时,如果数组长度发生变化,会导致key的变化,比如删除其中某一项,那么index会相应变化。
所以用index作为key和不加key没有什么区别,都不能提升性能。一般用每项数据的唯一值来作为key,就算数组长度变化,也不会影响到这个key

vue中如何编写可复用的组件

(1)以组件功能命名
(2)只负责ui的展示和交互动画,不要在组件里与服务器打交道(获取异步数据等)
(3)可复用组件不会因组件使用的位置、场景而变化。尽量减少对外部条件的依赖。

完整的 vue-router 导航解析流程

https://zhuanlan.zhihu.com/p/99199175

vue-router的几种实例方法以及参数传递

router.push

和name配对的是params, 刷新页面参数丢失

和path配对的是query, 刷新页面参数不丢失 地址栏携带参数

this.$router.push({ name: 'news', params: { userId: 123 }}); // **刷新页面参数会丢失**
this.$router.push({ path: '/news', query: { userId: 123 }}); // **刷新页面数据不会丢失**

1.命名路由搭配params,刷新页面参数会丢失

2.查询参数搭配query,刷新页面数据不会丢失 因为地址栏携带参数

3.接受参数使用this.$router后面就是搭配路由的名称就能获取到参数的值

vue-router如何定义嵌套路由?

children

const router = new VueRouter({
  routes: [
    { path: '/testPage',     component: testPage,
      children: [
        {
          path: '/sonPageA',
          component: sonPageA
        },
        {
          path: '/sonPageB',
          component: sonPageB
        }, 
      ]
    },
    {
        // 其他和testPage平级的路由
    }
  ]
})

vue-router如何实现路由懒加载( 动态加载路由 )

https://blog.csdn.net/xm1037782843/article/details/88225104

router的meta有什么用

在meta对象中可以设置一些状态,通常设置标题或是否需要缓存。$route.meta.keepAlive/$route.meta.title

{
    path:"/test",
    name:"test",
    component:()=>import("@/components/test"),
    meta:{
        title:"测试页面", //配置title
        keepAlive: true //是否缓存
    }
}

文章作者: wsh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 wsh !
 上一篇
css 设置span的宽度 css 设置span的宽度
在默认的情况下,利用css样式对span进行宽度设定是无效,但有时为了某种排版的要求,需要对span进行宽度设定,那么如何在html中利用css样式设定span的宽度?
2021-07-31
下一篇 
Vue 引入远程js文件 Vue 引入远程js文件
Vue中有时候需要引用远程的js文件,又不想下载js到本地,解决办法分享之
2021-03-25
  目录