componentDidMount() {
load().then(result => {
this.setState({ Component: result.default});
});
}
render() {
let { Component } = this.state;
return Component && ;
}
}
}
复制代码
[图片上传中…(image-ff4a29-1613564736594-2)]
2: PureComponent,memo解决无效渲染问题
1:PureComponent,memo基本使用
import React,{PureComponent,memo,Component} from ‘react’;
export default class App extends React.Component{
constructor(props){
super(props);
this.state = {title:‘计数器’,number:0}
}
add = (amount)=>{
this.setState({number:this.state.number+amount});
}
render(){
console.log(‘App render’);
return (
{this.props.number}
) } } class ClassTitle extends Component{ render(){ console.log('ClassTitle render'); return ({this.props.title}
) } } const FunctionTitle = function (props) { console.log('FunctionTitle render'); return{props.title}
; } 复制代码[图片上传中…(image-4f17fb-1613564736594-1)]
从上面可以看出只要父组件setstate,子组件无论class组件还是函数式组件无论props是否改变都会进行渲染, 很显然这样是不合理的,所以react自带两个东西PureComponent(类组件),memo(函数组件)具体使用如下
import React,{PureComponent,memo,Component} from ‘react’;
export default class App extends React.Component{
constructor(props){
super(props);
this.state = {title:‘计数器’,number:0}
}
add = (amount)=>{
this.setState({number:this.state.number+amount});
}
render(){
console.log(‘App render’);
return (
class Counter extends PureComponent{
render(){
console.log(‘Counter render’);
return (
{this.props.number}
) } } class ClassTitle extends PureComponent{ render(){ console.log('ClassTitle render'); return ({this.props.title}
) } } const FunctionTitle = memo(props=>{ console.log('FunctionTitle render'); return{props.title}
; }); 复制代码[图片上传中…(image-5d6095-1613564736594-0)]
效果显著,这样的话无论class组件还是函数式组件 只要props不变化,组件就不会在渲染
2:来我们一起手动实现 PureComponent,memo
import React from ‘react’;
export class PureComponent extends React.Component{
shouldComponentUpdate(nextProps,nextState){
return !shallowEqual(this.props,nextProps)||!shallowEqual(this.state,nextState)
}
}
export function memo(OldComponent){
return class extends PureComponent{
render(){
return <OldComponent {…this.props}/>
}
}
}
export function shallowEqual(obj1,obj2){
if(obj1 === obj2)
return true;
if(typeof obj1 !== ‘object’ || obj1 =null || typeof obj2 ! ‘object’ || obj2 =null){
return false;
}
let keys1 = Object.keys(obj1);
let keys2 = Object.keys(obj2);
if(keys1.length ! keys2.length){
return false;
}
for(let key of keys1){
if(!obj2.hasOwnProperty(key) || obj1[key]!== obj2[key]){
return false;
}
}
return true;
}
复制代码
是不是很有趣😄
总结
=============================================================
从转行到现在,差不多两年的时间,虽不能和大佬相比,但也是学了很多东西。我个人在学习的过程中,习惯简单做做笔记,方便自己复习的时候能够快速理解,现在将自己的笔记分享出来,和大家共同学习。
个人将这段时间所学的知识,分为三个阶段:
第一阶段:HTML&CSS&JavaScript基础
第二阶段:移动端开发技术
第三阶段:前端常用框架
-
推荐学习方式:针对某个知识点,可以先简单过一下我的笔记,如果理解,那是最好,可以帮助快速解决问题;如果因为我的笔记太过简陋不理解,可以关注我以后我还会继续分享。
-
大厂的面试难在,针对一个基础知识点,比如JS的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。