做后台管理系统使用react时,为什么选用ant-design ui框架?
值得借鉴——参考链接:https://mp.weixin.qq.com/s/3ZcH3hvmoXfQIgRWnFfNBQ
1、调用 setState 之后发生了什么?
在代码中调用setState函数之后,React 会将传入的参数对象与组件当前的状态合并,然后触发所谓的调和过程(Reconciliation)。经过调和过程,React 会以相对高效的方式根据新的状态构建 React 元素树并且着手重新渲染整个UI界面。在 React 得到元素树之后,React 会自动计算出新的树与老树的节点差异,然后根据差异对界面进行最小化重渲染。在差异计算算法中,React 能够相对精确地知道哪些位置发生了改变以及应该如何改变,这就保证了按需更新,而不是全部重新渲染。
1.1、react基本原理和优化?
react是用于构建用户界面的JS框架。因此react只负责解决view层的渲染
react做了什么?
- Virtual Dom模型
- 生命周期管理
- setState机制
- diff算法
- React patch、事件系统
- react的 Virtual Dom模型
经过diff算法会计算出virtual dom的差异,然后将这些差异进行实际的dom操作更新页面
参考链接:https://segmentfault.com/a/1190000015648248?utm_source=tag-newest
1.1、redux或者mobx 原理及使用?
2、React 中 Element 与 Component 的区别是?
简单而言,React Element 是描述屏幕上所见内容的数据结构,是对于 UI 的对象表述。典型的 React Element 就是利用 JSX 构建的声明式代码片然后被转化为createElement的调用组合。而 React Component 则是可以接收参数输入并且返回某个 React Element 的函数或者类。
3、在什么情况下你会优先选择使用 Class Component 而不是 Functional Component?
在组件需要包含内部状态或者使用到生命周期函数的时候使用 Class Component ,否则使用函数式组件。
4、React 中 refs 的作用是什么?
注意,根据React最新文档,下面这种用法已经被弃用了,统一改为回调函数模式this.refs.textInput
Refs 是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄。我们可以为元素添加ref属性然后在回调函数中接受该元素在 DOM 树中的句柄,该值会作为回调函数的第一个参数返回:
class CustomForm extends Component {
handleSubmit = () => {
console.log("Input Value: ", this.input.value)
}
render () {
return (
<form onSubmit={this.handleSubmit}>
<input
type='text'
ref={(input) => this.input = input} />
<button type='submit'>Submit</button>
</form>
)
}
}
上述代码中的input域包含了一个ref属性,该属性声明的回调函数会接收input对应的 DOM 元素,我们将其绑定到this指针以便在其他的类函数中使用。另外值得一提的是,refs 并不是类组件的专属,函数式组件同样能够利用闭包暂存其值:
function CustomForm ({handleSubmit}) {
let inputElement
return (
<form onSubmit={() => handleSubmit(inputElement.value)}>
<input
type='text'
ref={(input) => inputElement = input} />
<button type='submit'>Submit</button>
</form>
)
}
5、React 中 keys 的作用是什么?
Keys 是 React 用于追踪哪些列表中元素被修改、被添加或者被移除(删除)的辅助标识。
一个好的经验法则是:在 map()
方法中的元素需要设置 key 属性。
render () {
return (
<ul>
{this.state.todoItems.map(({task, uid}) => {
return <li key={uid}>{task}</li>
})}
</ul>
)
}
在开发过程中,我们需要保证某个元素的 key 在其同级元素中具有唯一性。在 React Diff 算法中 React 会借助元素的 Key 值来判断该元素是新近创建的还是被移动而来的元素,从而减少不必要的元素重渲染。此外,React 还需要借助 Key 值来判断元素与本地状态的关联关系,因此我们绝不可忽视转换函数中 Key 的重要性。
这样,有了key属性后,就可以与组件建立了一种对应关系,react根据key来决定是销毁重新创建组件还是更新组件。
-
key相同,若组件属性有所变化,则react只更新组件对应的属性;没有变化则不更新。
-
key值不同,则react先销毁该组件(有状态组件的
componentWillUnmount会执行
),然后重新创建该组件(有状态组件的constructor
和componentWillUnmount
都会执行)
另外需要指明的是:
key不是用来提升react的性能的,不过用好key对性能是有帮助的。
如何有key 数组中删掉一个元素,则会把之前的全部删掉重新再渲染
key的最佳实践
上面说到了,由数组创建的子组件必须有key属性,否则的话你可能见到下面这样的warning:
Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of `ServiceInfo`. See https://fb.me/react-warning-keys for more information.
可能你会发现,这只是warning而不是error,它不是强制性的,为什么react不强制要求用key而报error呢?其实是强制要求的,只不过react为按要求来默认上帮我们做了,它是以数组的index
作为key的。
index作为key是一种反模式
在list数组中,用key来标识数组创建子组件时,若数组的内容只是作为纯展示,而不涉及到数组的动态变更&#x