如何让一个盒子在水平方向和垂直方向都居中
display:flex; justify-content:center;//水平居中 align-items:center;//垂直居中
/* 这里引用复用代码 */ .outer { display: grid; } .inner { justify-self: center; /* 水平居中 */ align-self: center; /* 垂直居中 */ }
less或者sass相比于css有什么优势?
如何做响应式布局或者如何适配
css sprite(雪碧图或者精灵图) 有什么优缺点?
你知道哪些css3新特性和h5新特性
标签 | 描述 |
header | 定义了文档的头部区域 |
footer | 定义了文档的尾部区域 |
section | 定义文档中的节(section、区段) |
nav | 定义文档的导航 |
aside | 定义页面的侧边栏内容 |
article | 定义页面独立的内容区域 |
detailes | 用于描述文档或文档某个部分的细节 |
summary | 标签包含 details 元素的标题 |
dialog | 定义对话框,比如提示框 |
值 | 描述 | 补充 |
linear-gradient() | 创建一个线性渐变的 "图像"(默认从上到下) | |
radial-gradient() | 用径向渐变创建 "图像"。 | |
repeating-linear-gradient() | 创建重复的线性渐变"图像" | |
repeating-radial-gradient() | 创建重复的径向渐变"图像" | |
inherit | 指定背景图像应该从父级元素继承 |
值 | 描述 | |
position | 定义渐变的位置 center(默认):设置中间为径向渐变圆心的纵坐标值。 top:设置顶部为径向渐变圆心的纵坐标值。 bottom:设置底部为径向渐变圆心的纵坐标值 |
|
shape | 定义圆的类型: ellipse(默认)指定椭圆形的景象渐变 circle:指定圆形的径向渐变 |
|
size | 定义渐变的大小 farthest-corner(默认)指定径向渐变的半径长度为从圆心到离圆心最远的角 closest-side :指定径向渐变的半径长度为从圆心到离圆心最近的边 closest-corner : 指定径向渐变的半径长度为从圆心到离圆心最近的角 farthest-side :指定径向渐变的半径长度为从圆心到离圆心最远的边 |
js数据类型有哪些?有什么区别
JS的基本数据类型:Undefined、Null、Boolean、Number、String ,sysmbol
Undefined类型只有一个值,即特殊的undefined,声明变量但是没有初始化,这个变量的值就是undefined
Null类型只有一个值null,表示一个空对象指针,正式使用typeof操作符检测null会返回object
Boolean有两个字面值:true和false
Number:用来表示整数和浮点数,还有一种特殊的值即NaN,这个数值用来表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由单引号(')或双引号(")表示。
三大引用类型
Object类型
Array类型
Function类型
存储空间:基本类型存在栈中,引用类型存在堆上
值传递:基本类型传递的是值,引用类型传递的是地址(引用)
作为函数的参数:基本类型传递的是值,引用类型传递得是地址
谈一下你对作用域的理解
谈一下你对原型的理解
__proto__
===null
什么是闭包(要改,加上闭包的优缺点)
如何修改函数的this指向,这些方法之间有什么区别?
可以使用apply、bind、call方法改变this指向(并不会改变函数的作用域)。区别如下:
(1)三者第一个参数都是this要指向的对象,也就是想指定的上下文,上下文就是指调用函数的那个对象(没有就指向全局window);
(2)apply和bind的第二个参数都是数组,call接收多个参数并用逗号隔开;
(3)apply和call只对原函数做改动,bind会返回新的函数(要生效还得再调用一次)。
事件委托或者事件代理的原理是什么?
事件冒泡
事件冒泡和事件捕获的区别是什么?
你知道的es6新特性有哪些?
...
js异步编程方式有几种
promise有几种状态
const myPromiseObj = new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve() }) }) myPromiseObj.then(()=>{}).catch(()=>{})
resolve和reject是两个函数,这两个函数就是promise参数,成功调用resolve,失败调用reject。
js如何浅拷贝和深拷贝一个对象
浅拷贝:Object.assign 或者拓展运算符...
深拷贝:const deepCopiedObj = JONS.parse(JSON.stringify(obj))
let obj ={ name:'张三' age:12, address:{ city:'成都 } }; let o={...obj}
let newobj = {}; //深克隆 function deepClone(newobj ,obj){ //先进行浅克隆 object . assign(newobj , obj); //判断是否有对象属性 for (const key in obj) { if(typeof obj[key]==' object' ){ //是一个对象 属性 newobj [key]={}; //使用递归 deepClone (newobj[key], obj [key]); } } }
rem和em和px的区别
px是固定单位,rem和em是响应式单位,1rem的大小取决于根节点html的字体大小(即font-size属性),1em的大小取决于其父节点的字体大小,在移动端我们一般用rem,但是要注意:这时html的fontSize属性应该是动态计算的,而不是写死,一般是把当前可视窗口的宽度除以一个经验值得到的比值作为html的fontSize属性值的。
for循环中break和continue的区别是什么?
如何用原生js给一个按钮的点击事件绑定两个事件处理函数
addEventListener
绑定多个事件
js引擎如何实现异步的?
浏览器是多线程的,js引擎只是其中一个线程,
除此之外还有http请求线程,事件处理线程,GUI渲染线程
什么是函数柯理化?
通过函数返回函数的方式(闭包),让一个一次性接受多个参数的函数,分解为一次只接受一个参数的若干函数的组合
其作用是为了参数的复用,
function towSum(a,b){ return a + b; } //现在对上面的函数进行柯理化 function towSum(a){ return function(b){ return a + b; } } 或者 const res = (a)=>(b)=>a+b;
微任务和宏任务的区别
DOMContentLoaded和load事件的区别
代码题
var a = {}; var b = {key:"b"}; var c = {key:"c"}; a[b] = "b"; a[c] = "c"; console.log("a[b]",a[b]);//a[b] c
var age = 100; let years = 6; if(age > 12){ let age = 10; var years = age*3; } //问:运行的结果是什么? 报错,不能运行,age和years已经存在了
componentDidMount() { this.setState({ count: this.state.count + 1 }); console.log('1', this.state.count); this.setState({ count: this.state.count + 1 }); console.log('2', this.state.count); setTimeout(() => { this.setState({ count: this.state.count + 1 }); console.log('3', this.state.count); this.setState({ count: this.state.count + 1 }); console.log('4', this.state.count); }, 0); } //打印结果 1234
function Cat() { let showName = function () { console.log(1); } return this; } Cat.showName = function () { console.log(2) }; Cat.prototype.showName = function () { console.log(3) }; var showName = function () { console.log(4) }; function showName() { console.log(5) }; Cat.showName(); showName(); Cat().showName(); showName(); new Cat.showName(); new Cat().showName(); new new Cat().showName(); //打印结果?? 2423
function Cat() { showName = function () { console.log(1); } console.log('this',this) return this; } Cat.showName = function () { console.log(2) }; Cat.prototype.showName = function () { console.log(3) }; var showName = function () { console.log(4) }; function showName() { console.log(5) }; Cat.showName();//2 showName();//4 Cat().showName();//1 showName();//1 new Cat.showName();//2 new Cat().showName();//3 new new Cat().showName();//3 //打印结果,注意跟上一题的区别
this.setState((state,props)=>{ return {total:state.total + props.count} });
{user=>user===null ? import React ,{Component} from 'react'; import PropTypes from 'prop-types'; import fetchUser from 'utils'; //fetchUser接收用户名,并返回promise //当得到用户数据的时候返回resolve状态 class Profile extends Component{ //在这里写下你的代码 }: }{" "}
vue组件中watch和computed的区别
vue常用的生命周期钩子函数有哪些?分别有什么作用?
钩子函数 | created | mounted | updated | beforeDestory |
执行时机 | 数据初始化完毕之后 | DOM渲染完毕之后 | 数据更新完毕并且DOM更新完毕之后 | 组件卸载之前 |
作用 | 发送请求 | 发送请求、获取DOM等 | 发送请求(注意加上条件判断)、获取DOM等 | 性能优化相关,比如清除定时器、延时器、解绑事件等 |
vue如何实现组件通信(组件传值)? 父子 兄弟 复杂组件关系
组件关系 | 父子 | 兄弟 | 复杂组件关系 |
通信方式 | props/绑定自定义事件、$emit | 状态提升、事件总线 | 状态机vuex |
vue如何提取组件的公共逻辑
vuex/mixins
vue项目如何做路由拦截?
全局守卫:
beforeEach//只有进入一个路由的时候就会触发
beforeResolve//当路由解析完成以后去执行
afterEach//全部加载完成以后执行
组件内守卫
beforeRouteEnter 进入组件之前
beforeRouteLeave 离开组件之后
beforeRouteUpdate
vue的响应式原理 Object.defineProperty
vue组件中data里面的数据,在初始渲染之前都会被Object.defineProperty转化成响应式数据,然后这些数据的访问和修改就能够被监听了,每当数据被访问的时候就会触发getter,接着会通知watcher,watcher这是会做一次依赖的收集或者更新,然后watcher会负责通知渲染界面(先转化为虚拟DOM,在映射为真正的DOM)。每当数据被设置的时候会触发setter,接着setter也会通知watcher,watcher在去通知渲染界面
v-if和v-show的区别
keep-alive组件有什么作用
keep-alive是vue内置的一个组件,而这个组件的作用就是能够缓存不活动的组件,我们能够知道,一般情况下,组件进行切换的时候,默认会进行销毁,如果有需求,某个组件切换后不进行销毁,而是保存之前的状态,那么就可以利用keep-alive来实现
this.$nextTick有什么作用
移动版的updateted
当data中的某个属性改变的时候,这个值并不是立即渲染到页面上,而是先放到watcher队列上(异步),只有当前任务空闲的时候才会去执行watcher队列上的任务。所以导致,改变的数据挂载到dom上会有一定的延迟,这也就导致了,当我们在改变属性值的时候,立即通过dom去拿改变的值时发现拿到的值并不是改变的 值,而是之前的值。
this.$nextTick作用:在下次dom更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获得更新后的dom
Vue实现响应式并不是在数据发生后立即更新DOM,使用vm.$nextTick是在下次DOM更新循环结束之后立即执行延迟回调。在修改数据之后使用,则可以在回调中获取更新后的DOM。
this.$set有什么作用
vue如何做路由懒加载
路由配置中component属性的值修改为:()=>import(组件路径)
你认为vue 框架和jquery有什么区别?
如果要让watch监听器立即执行一次,该如如何处理?
shouldComponentUpdate有什么作用?
它是react组件的一个 生命周期钩子函数,每次数据更新时,首先会执行该钩子函数,如果返回true,表示可以更新界面,然后后续的钩子函数才会陆续执行,返回false,则表示不可以更新,后续的钩子函数也不会执行,当然它默认返回true,
我们一般不会直接在组件中使用该钩子函数,而是会选择PureCompopnent来代替Component,在PureComponent里面就利用来该钩子函数来做优化
setState有什么特性
它的作用是更新组件内部状态,可以接受两个参数,参数一个一般是个对象,在底层react会通过Object.assign把传入的对象和原来的state进行合并,当然也可以传入一个函数,这个函数会接受两个形参(一个表示state,一个表示props),并返回个对象,要注意的是,这个函数在执行是会保证之前的state已经更新完毕,最后在把该函数返回的对象和原来的对象进行合并。当新的状态值会基于老的状态值时,我们会倾向于给setState的第一个参数传递一个函数进去。它的第二个参数则是一个回调函数,会在数据更新完毕,并且dom更新完毕时执行。
另外,当我们在react事件体系或者组件生命周期钩子函数里面直接调用setState的时候,它是异步的,其他情况是同步的,比如在setTimeout/setInterval里面调用就是同步的
this.setState({name:'张三'}); this.setState((state,props)=>({})
react列表渲染时,key的作用
react组件之间如何通信
解释一下redux核心概念
三大核心概念 :action reducer store
react常用的生命周期钩子函数有哪些?分别有什么作用
react中refs有什么作用?
redux中间件是什么,有什么作用,你常用的中间件有哪些?
redux三大原则是什么?
react中容器组件和展示组件有什么区别?
展示组件
容器组件
函数组件和类组件有什么区别(16.8以前)?
react16.8以前函数组件只能被动接收外部数据,并且没有自己的生命周期钩子函数,没有state,函数内部没有this可用
你对react新特性hooks有什么了解吗?
Hooks是能够让你在react组件函数内部关联state和生命周期特性的函数,计算属性
hooks特性只能在函数组件中使用
react如何提取组件之间的公共逻辑
什么是高阶组件?有什么作用?你常用的高阶组件有哪些
受控组件和不受控组件有什么区别?
受控组件:通过setState的形式控制输入的值及更新,
非受控组件:即通过DOM的形式更新值,要获取其值可以通过ref的形式去获取
JSX的底层原理是什么?
通过React.createElement创建虚拟DOM 标签
react组件的数据来源有哪些?他们之间有什么区别?
分为外部数据和内部数据
外部数据只读,
react插槽是什么?(或者react中如何实现组件复合?)
位于组件标签之间的内容就是插槽,要显示插槽内容需要在组件内部通过this.props.children渲染
小程序一个页面有几个文件构成?
小程序怎么跟后台交互
(1)直接用微信官方提供的接口 wx.request接口,跟jquery的ajax差不多
小程序怎么做扫码功能(wx.scanCode),怎么做支付功能(wx.requestPayment)
(1)调用微信提供的现成的接口(wx.开头的),即可,具体参数怎么传参照文档即可
微信里面怎么获取用户的手机号??
(1)简单,直接用微信官方提供的现成组件button即可,具体用法是在button上加一个属性opent-type,方它的值为getPhoneNumber,不知道怎么用的去找微信官文档看看
小程序分包是什么?有什么作用?
小程序的分包总包大小并不超过16M,分八个包,每个包不超过2M
提示:跟vue路由懒加载有类似的作用,提升用户体验度,减少首屏渲染速度
https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/basic.html
https://blog.csdn.net/acmdown/article/details/80037660
说一下项目中微信授权登录的流程。前后端是如何去交互的其他
从用户在浏览器中输入url,到浏览器渲染出界面,中间发生了什么?
DNS域名解析------》发起http或者https请求------》服务端处理请求-------》浏览器接受请求响应,并渲染界面
如何提高首屏(注意:不是首页,一般你在url中输入一个新的路劲,然后回车,即是一个首屏)的渲染速度
DNS域名解析部分优化
在html头部使用link标签进行DNS预解析
发起请求部分
服务端优化:不需要关注
使用单独的图片服务器、使用redis缓存、使用负载均衡等等
浏览器渲染
优化要达到的目的:间隔时间合适,同时用户不会觉得卡
let originStep = 10; let step = 10;//每次移动的距离 let direction = 1;//移动的方向1表示向右,-1表示向左 let left = 0;//元素的偏移量 const offsetWidth = document.body.offsetWidth;//body的宽度 const el = document.getElementById('myDiv'); const eleWidth = el.offsetWidth;//元素的宽度 const runAnimation = () => {} if(direction === 1){ const remainOffset = offsetWidth - (left + eleWidth);//向右移动时,距离右边距剩余距离 if(remainOffset < step && remainOffset !== 0){ step = remainOffset;//保证向右的移动不会超出右边接线 } }else{ step = originStep;//当向左移动的时候恢复移动速度 } if(left <=0){ direction = 1; }else if(offsetWidth <= left + eleWidth){ direction = -1; } const xOffset = left += step*direction; el.style.transform = `translate(${xOffset}px,0)`; requestAnimationFrame(runAnimation);//在注册回调 } requestAnimationFrame(runAnimation)
const cancelId = requestAnimationFrame(runAnimation); cancelAnimationFrame(cancelId);
webpack有什么作用?
什么是wepack ?模块化的打包工具,原理是,我们必须向它提供一个入口js文件, 然后webpack会根据这个入口文件生成一张依赖图,然后在堆这张依赖图里面的文件进行转义和打包,最后生产浏览器能够识别的资源文件(css,js)
作用:
webpack常用配置项有哪些?(webpack.config.js)
module:{ rules:[ test:/\.css$/, use:['style-loader','css-loader'],//从后往前执行 ] }
常用的http状态码有哪些,
http和https的区别
安全:https协议在传输数据的时候,会对数据进行加密,http则是明文传输。
性能:http协议的传输性能更高,因为对于传输同样的数据量来讲,由于https协议需要加密数据,所有最终在线路上,它的数据量要大一点
费用:https需要购买证书,http则免费
端口不同:http端口是80,https端口是443
websokect和http的区别
websokect能够实现客户端和服务端的双向通信,而http则只能是单向通信,由客户端请求服务端,服务端不能主动的向客户端推送数据。
应用场景:
如何处理权限问题
比如我们的后台管理系统,不同的角色看到的侧边栏是不同的,如何实现?
前端如何实现身份验证
前端现在一般用token实现身份验证,
数据可视化如何实现(echart)
option setOption(option)
如何实现数据的实时更新 websokect
什么是跨域?如何解决
devServer:{ proxy:{ "/api":{ target:"http://localhost:8000" } } }
浏览器渲染页面的流程
根据这些过程,我们可以知晓在写html的时候,需要注意的事项:(性能优化)
//
重绘和回流有什么区别
6.什么是防抖节流?
防抖和节流有什么区别,如何实现
在高频触发的事件中,可能会导致一些性能问题,比如在PC端浏览器缩放时(resize事件),我们在事件处理函数里面如果操作DOM,则用户缩放的时候,可能会导致浏览器卡顿,这是我们就可以通过防抖节流来控制操作DOM的频率,避免过快的操作DOM,但是这两者的区别在于:
防抖的思路是:设置一个延时器,延时n秒在执行相应的逻辑(即频繁执行可能会影响性能的逻辑),如果在n秒内,再次执行了,则清空延时器,并从当下开始从新设置延时器,n秒后再执行。
节流的思路是:在特定的时间段内,相应的逻辑必须有且只能执行一次。
//防抖 function debunce(func,time){ let timer = null; return function(){ if(timer)clearInterval(timer); timer = setTimeout(()=>{ func.apply(this,arguments) },time); } } //节流 function throttle(func,time){ let preTime = +new Date() return function(){ const curTime = +new Date() if(curTime - preTime >= time){ func.apply(this,arguments); preTime = curTime; } } }
v-model如何实现表单的双向绑定
你知道的数据结构有哪些?
context是什么
是react提供的一种跨组件层级的一个方式
我们在项目开发一般不会用它,会用基于他的redux,
我们创建context react.create.Context
前端登录后,传递id给后端获取数据,这种方式安全吗?你是如何来避免的
get方式修改为post方式
http协议修改为https协议
token过期
配置权限的时候,前端如何对留有进行限制(没有权限的用户无法直接通过地址栏访问到其他权限的资源)
请说一下你项目中微信支付流程如何做的
为什么使用uni-app,你在项目开发的过程中遇到哪些兼容问题,以及如何解决的
开发效率比原生的开发效率高,数据管理比较方便
uni-app中要跳转路径,如何提高页面加载效率
使用uni.preloadPage页面预加载,但是该方法有兼容性,只在spp端和H5端有效
如果要让watch监听器立即执行一次,该如如何处理?
我们可以添加 immediate 属性
watch 有三个参数
handler
:其值是一个回调函数。即监听到变化时应该执行的函数deep
:其值是 true 或 false;确认是否深入监听。immediate
:其值是 true 或 false,确认是否以当前的初始值执行 handler 的函数
watch: { keyWord: { handler: 'getList', immediate: true } }
项目中如何实现上拉加载,下拉刷新的,如果要自己实现,说一下思路
通过onReachBottom监听到用户上拉到底,然后将数据重置,下拉刷新使用onPullDownRefresh监听用户的动作,将当前页加1之后传进去,当当前页等于总页数的时候提示用户没有数据了
项目是如何打包上线的,打包的时候需要配置些什么内容
react项目打包,在项目路径下,敲npm run buil,就出现了build文件夹
build生成的这些东西要放在服务器root下,可以在pakege.json里,
也能让它充当静态的服务器,敲:npm install -g serve,在敲serve -s build
部署方法:
使用npm run build将项目打包
把打包后地文件件夹中内容放到tomcat中webapps下的root中
开启服务器访问localhost:8080端口即可以看到你的项目内容
不放置在Root目录下的坑:
由于默认path.js【路径:你的react项目名\node_modules\react-scripts\config\path.js】的配置是’/’即对根目录有效,所以如果不放在root下则需要将’/’变成’./’即相对路径有效。(修改代码约在第45行)