答:flex是由三个属性组成:
答:rem是一个相对单位,相对根元素字体大小的单位。我们只需要指定根元素为参考值,就可以了。1rem等于根元素的fontSize大小
答:rpx是解决屏幕自适应的尺寸单位,可以根据屏幕宽度进行自适应,不论大小屏幕,规定屏幕宽为750rpx。 计算方式:1除以750 再乘以屏幕宽度像素等于1rpx是多少像素
答: 1. !important
答:1.flex-direction属性决定主轴的方向(即项目的排列方向)。 2.flex-wrap属性决定是否布局是否换行。 3.justify-content属性定义了项目在主轴上的对齐方式。 4.align-items属性定义项目在交叉轴上如何对齐。 5.align-content属性定义了多根轴线的对齐方式。 6.order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。 7.flex-grow属性定义项目的放大比例,默认为0,,即如果存在剩余空间,也不放大。 8.flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。 9.flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。默认auto,项目本身宽度。 10.flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。 11.align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。
答:BFC 定义 BFC (Block formatting context)块级格式化格式化上下文,它是一种独立的渲染区域,只有Block-level-box参与,它规定了内部的Block-level-box如何布局,并且与这个区域外部毫不相干。 2、生成BFC: 根元素 float属性不为none position为absolute或fixed display为inline-block, table-cell, table-caption, flex, inline-flex overflow不为visible
1.利用 clear 属性,在浮动元素末尾添加一个带有 clear: both 属性的空 div 来闭合元素,利用 :after 伪元素在元素末尾添加一个内容为空高为0并带有 clear: both 属性的元素。 2.触发浮动元素父元素的 BFC (Block Formatting Contexts, 块级格式化上下文),使到该父元素可以包含浮动元素。overflow:hidden
答:1. ===:称为等同符,当两边值的类型相同时,直接比较值,若类型不相同,直接返回false;
答:1. 内存泄漏:就是没有使用,或已经使用完的变量,没有及时回收。
答:1.https协议需要到CA申请证书。 2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。 3.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
答:基础:toString()、join()、pop()、push()、shift()、unshift()、splice()、concat()、slice()、reverse()、sort()、tolocaleString()、valueOf() es6+:map()、filter()、reduce()、every()、some()、indexOf()、lastIndexOf()、forEach()、find()、findIndex()、fill()、copyWithin()、from()、of()、entries()、keys()、values()、includes()
答:1.值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。 2.引用数据类型:对象(Object)、数组(Array)、函数(Function)。
答:1. 基本类型的变量会保存在栈内存中,如果在一个函数中声明一个值类型的变量,那么这个变量当函数执行结束之后会自动销毁 2.引用类型的变量名会保存在栈内存中,但是变量值会存储在堆内存中,引用类型的变量不会自动销毁,当没有引用变量引用它时,系统的垃圾回收机制会回收它
答: 1. 箭头函数是匿名函数,不能作为构造函数,不能使用new
答:1.变量声明方式:const和let 2.模板字符串 3.箭头函数
答: 闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取[局部变量],所以闭包可以理解成“定义在一个[函数]内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
null:Null类型,代表 “空值”,代表一个空对象指针,使用typeof运算得到 “object” ,所以可以认为它是一个特殊的对象值。
undefined 是 Undefined 类型的唯一值,它表示未定义的值。当声明变量未赋值时,或者定义属性未设置值时,默认值都为 undefined。
答:Promise是异步编程的一种解决方案 Promise对象有以下2个特点: 1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。 2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved;从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象田静回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
答: axios请求拦截:每次请求都尝试带上token.
// 请求拦截器
axios.interceptors.request.use(
config => {
// 每次发送请求之前判断vuex中是否存在token
// 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
const token = store.state.token;
token && (config.headers.Authorization = token);
return config;
},
error => {
return Promise.error(error);
})
响应拦截:请求失败的统一处理。
// 响应拦截器
axios.interceptors.response.use(
response => {
// 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
// 否则的话抛出错误
if (response.status === 200) {
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
// 服务器状态码不是2开头的的情况
// 这里可以跟你们的后台开发人员协商好统一的错误状态码
// 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等
// 下面列举几个常见的操作,其他需求可自行扩展
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登录
// 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后返回当前页面,这一步需要在登录页操作。
case 401:
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
break;
// 403 token过期
// 登录过期对用户进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页面
case 403:
Toast({
message: '登录过期,请重新登录',
duration: 1000,
forbidClick: true
});
// 清除token
localStorage.removeItem('token');
store.commit('loginSuccess', null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
setTimeout(() => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;
// 404请求不存在
case 404:
Toast({
message: '网络请求不存在',
duration: 1500,
forbidClick: true
});
break;
// 其他错误,直接抛出错误提示
default:
Toast({
message: error.response.data.message,
duration: 1500,
forbidClick: true
});
}
return Promise.reject(error.response);
}
}
})
答: 初始化阶段
更新阶段
static getDerivedStateFromProps()
shouldComponentUpdate()
render()
getSnapshotBeforeUpdate()
componentDidUpdate()
错误捕获
答:在某些情况下,你需要在典型数据流之外强制修改子组件。被修改的子组件可能是一个 React 组件的实例,也可能是一个 DOM 元素。可以利用refs。 下面是几个适合使用 refs 的情况: 管理焦点,文本选择或媒体播放。 触发强制动画。 集成第三方 DOM 库。
答:不可以,因我执行setState后会触发render,所有会报错,会死循环
答:受控组件就是可以被 react 状态控制的组件,绑定了value属性和onChange方法,value为当前组件的state,onChange将触发setState
答:useEffect对的返回值可以模仿类组件的componentWillUnmount,清除一些计时器和订阅事件或请求
答:connect 是一个高阶组件 内部利用context获取state和dispatch,根据不同的参数(mapStateToProps,mapDispatchtoProps,mergeProps),扩展传入组件的属性,使这些值可以在props中获取
答:解决问题:1.在组件之间复用状态逻辑很难,React 没有提供将可复用性行为“附加”到组件的途径,你也许会熟悉一些解决此类问题的方案,比如 render props 和 高阶组件。但是这类方案需要重新组织你的组件结构,你可以使用 Hook 从组件中提取状态逻辑,使得这些逻辑可以单独测试并复用。Hook 使你在无需修改组件结构的情况下复用状态逻辑。
答:Virtual DOM 是一种编程概念。在这个概念里, UI 以一种理想化的,或者说“虚拟的”表现形式被保存于内存中,并通过如 ReactDOM 等类库使之与“真实的” DOM 同步。这一过程叫做协调。
2.复杂组件变得难以理解,生命周期钩子中充满大量数据请求,计时器订阅等,无法拆分,还有在componentWillUnmount中清除,使人不好理解,hooks 的useEffect可将逻辑细粒拆分。
答:1.query方式: 路径为对象
var data = {id:3,name:sam,age:36};
var path = {
pathname:'/user',
query:data,
}
var data = {id:3,name:sam,age:36};
var path = {
pathname:'/user',
state:data,
}
答:基于当前组件创建分支:git checkout -b 分支名。 提交命令:git commit 切换分支:git checkout 命令行工具: 创建目录:mkdir 目录名 进入文件:cd 相对路径 发送请求:curl