优化一下 blog 界面,准备每次写都给你们看一张猫片(大雾)。javascript
想要理解高阶组件,咱们先来看看高阶函数的含义。java
setTimeout(() => {
console.log(1)
},1000)
复制代码
function foo(x){
return function(){
return x;
}
}
复制代码
setTimeout()
,setInterval()
就是普通的高阶函数。setTimeout()
setInterval()
// ajax
$.get('/api/v1',function(){
console.log('data')
})
复制代码
上面这两个就是标准的高阶函数react
-(原来之前的 HOC 就是高阶组件)git
// A.js
import React, { Component } from 'react';
function A(WrapperedComponent){
return class test extends Component{
return <div> <WrapperedComponent /> </div>
}
}
export default A;
// 其余组件使用的时候
// B.js
import A from './A';
class B extends Component{
return <div> hello world!! </div>
}
export default A(B)
复制代码
-- index.ts
-- /src
---- HOCprogress.tsx
---- A.tsx
---- B.tsx
---- C.tsx
复制代码
HOCprogress.tsx(1)github
import React, { Component } from "react";
// 而后包裹一个 function,用WrapperedComponent传入 class 的 render()中。
function HOCprogress(WrapperedComponent, value: number) {
//先写 class
return class hocForm extends Component {
render() {
return (
<div> <WrapperedComponent /> </div>
);
}
};
}
export default HOCprogress;
复制代码
// HOCprogress.tsx
import React, { Component } from "react";
function HOCprogress(WrapperedComponent, value: number) {
return class hocForm extends Component {
render() {
// 添加样式
const innerStyle = {
padding:'10px',
width: "100%"
};
const percentStyle = {
width: `${value}%`,
height: "20px",
background:
"url(https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2440333743,1684406640&fm=26&gp=0.jpg)"
};
return (
<div style={innerStyle}>
<div style={percentStyle}> {value} %</div>
<WrapperedComponent />
</div>
);
}
};
}
export default HOCprogress;
复制代码
A.tsxajax
import React, { Component } from "react";
// 引入高阶函数
import HOCprogress from "./HOCprogress.tsx";
class A extends Component {
render() {
return <div>这是 A 组件!</div>;
}
}
// 使用高阶组件包裹 A 组件
export default HOCprogress(A, 56);
复制代码
B.tsxredux
import React, { Component } from "react";
import HOCprogress from "./HOCprogress.tsx";
class B extends Component {
render() {
return <div>这是 B 组件!</div>;
}
}
// 咱们能够使用 @HOCprogress 装饰器这样的方式来替代函数包裹这种方式具体的见个人装饰器的那篇文章。
export default HOCprogress(B, 98);
// C.tsx 同上
复制代码
index.tsapi
import React from "react";
import C from "./C.tsx";
import B from "./B.tsx";
import A from "./A.tsx";
class App extends React.Component {
render(){
<div>
<A />
<B />
<C />
</div>
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
复制代码