笔试
以下代码执行输出结果是什么
function b () { console.log(a); var a = 10; funciton a(){}; a = 100; console.log(a);}b();// function a(){}// 100
数组去重, 能写几种写几种
//遍历数组法: 最简单数组去重法function unique1(array){ var result = []; //一个新的临时数组 //遍历当前数组 for(var i = 0; i < array.length; i++){ //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if (result.indexOf(array[i]) == -1) result.push(array[i]); } return result;}// 对象键值对法: 速度最快, 占空间最多(空间换时间)function unique2(array){ var obj = {}, result = [], len = array.length, val, type; for (var i = 0; i < len; i++) { val = array[i]; type = typeof val; if (!obj[val]) { obj[val] = true; result.push(val) } } return result;}// 数组下标判断法function unique3(array){ var n = [array[0]]; //结果数组 //从第二项开始遍历 for(var i = 1; i < array.length; i++) { //如果当前数组的第i项在当前数组中第一次出现的位置不是i, //那么表示第i项是重复的,忽略掉。否则存入结果数组 if (array.indexOf(array[i]) == i) n.push(array[i]); } return n;}//排序后相邻去除法 将相同的值相邻,然后遍历去除重复值function unique4(array){ array.sort(); var re=[array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== re[re.length-1]) { re.push(array[i]); } } return re;}// 优化遍历数组法 思路:获取没重复的最右一值放入新数组function unique5(array){ var r = []; for(var i = 0, l = array.length; i < l; i++) { for(var j = i + 1; j < l; j++) if (array[i] === array[j]) j = ++i; r.push(array[i]); } return r;}// es6 set去重funciton unique6(arr) { return Array.from(new Set(arr)) <!--或者--> return [...new Set(arr)]}// 利用includes实现去重function unique7(arr) { var result = []; for (var i = 0; i < arr.length; i ++) { if (!result.includes(arr[i)) { result.push(arr[i); } } return result;}// 利用reduce + includes 去重function unique8(arr) { return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);}// 利用Map结构去重function unique9 (arr) { let map = new Map(); let result = []; for (var i = 0; i < arr.length; i++) { if (map.has(arr[i])) { map.set(arr[i], true); } else { map.set(arr[i], false); result.push(arr[i]) } } return result;}
请列举出三个Vue中常用的生命周期钩子函数
vue组件之间的传值
父子组件如何交流
父到子
<child :a=a @change="change">
- 属性:props
- vm.$attrs子组件获取未注册的属性
- v-bind=”$attrs” 子组件传递给孙子组件
- this.
children 麻烦效率也比较低 不推荐
<div id="app"> <my-content :title="tilte" :content="content" ></my-content> </div> <script> const vm = new Vue({ el: '#app', data: { content: 'content', title: 'title' }, components: { myContent: { props: ['title'], created() { console.log(this.$attrs); }, inheritAttrs: false, template: `<div> <h3>{{title}}</h3></div> <my-p v-bind="$attrs"> </my-p></div>`, components: { myP: { props: ['content'], template: `<p>{{ content }}</p>` } } } } }) </script>
- provide inject
<div id="app"> <my-content ></my-content> </div> <script> const vm = new Vue({ el: '#app', provide: { content: 'content', title: 'title' }, components: { myContent: { inject: ['title'], created() { console.log(this.$attrs); }, inheritAttrs: false, template: `<div> <h3>{{title}}</h3></div> <my-p> </my-p></div>`, components: { myP: { inject: ['content'], template: `<p>{{ content }}</p>` } } } } }) </script>
子 —-》 父
- $emit(‘change’, )
- ref 引用
- $listener 所有绑定事件的函数的集合
<div id="app"> <my-cmp ref="cmp"></my-cmp></div><script> const vm = new Vue({ el: '#app', mounted() { console.log(this.$refs.cmp.msg); }, components: { myCmp: { data() { return { msg: 'hello world' } } } }, methods: { cmpFunc() { console.log('cmp') } }, template: `<div></div>` })</script>
子组件与子组件如何通信
- vuex
- event bus 事件总线
Vue.prototype.bus = new Vue();
路由之间跳转, 如何携带参数, 有哪些方式
1. <router-link :to={params: {}} /> 传参方式: - params传参(路由的配置 路由配置 path: "/home/:id" 或者 path: "/home/:id" ) - query传参 路由不需要额外配置2. this.$router.push() (函数里面调用) - this.$router.push({name:'home',query: {id:'1'}}) - this.$router.push({path:'/home',query: {id:'1'}}) // html 取参 $route.query.id // script 取参 this.$route.query.idquery和params区别 query类似 get, 跳转之后页面 url后面会拼接参数,类似?id=1, 非重要性的可以这样传, 密码之类还是用params刷新页面id还在 params类似 post, 跳转之后页面 url后面不会拼接参数 , 但是刷新页面id 会消失
vuex有哪几种属性? 不用vuex会带来什么问题?
VUEX共有五种属性,分别是 State、 Getter、Mutation 、Action、 Module不用vuex会带来的问题1、可维护性会下降,你要想修改数据,你得维护三个地方2、可读性会下降,因为一个组件里的数据,你根本就看不出来是从哪来的3、增加耦合,大量的上传派发,会让耦合性大大的增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背。
vue 双向绑定原理
<div> <input type="text" id="text"> <p id="show"></p></div><script> var obj = {}; Object.defineProperty(obj, 'text', { get: () => { return obj['text']; }, set: (val) => { show.innerText = val; text.value = val; } }); text.oninput = (e) => { obj.text = e.target.value; } // 新版vue用了Proxy</script>