[Recompose] Add Lifecycle Hooks to a Functional Stateless Component using Recompose
2024-08-25 23:08:31
Learn how to use the 'lifecycle' higher-order component to conveniently use hooks without using a class component.
import React from 'react';
import { withReducer, withHandlers, compose, lifecycle } from 'recompose'; // Mock Configuration
function fetchConfiguration() {
return new Promise((resolve) => {
setTimeout(() => resolve({
showStatus: true,
canDeleteUsers: true
}), );
});
}
const withConfig = lifecycle({
getInitialState(){
return { config: {} };
},
componentDidMount() {
fetchConfiguration()
.then((config) => {
this.setState({ config })
})
}
}) const UserStyle = {
position: 'relative',
background: 'lightblue',
display: 'inline-block',
padding: '10px',
cursor: 'pointer',
marginTop: '50px'
}; const StatusListStyle = {
background: '#eee',
padding: '5px',
margin: '5px 0'
}; const TooltipStyle = {
fontSize: '10px',
position: 'absolute',
top: '-10px',
width: '80px',
background: '#666',
color: 'white',
textAlign: 'center'
}; const StatusList = () =>
<div style={StatusListStyle}>
<div>pending</div>
<div>inactive</div>
<div>active</div>
</div>; const withToggle = compose(
withReducer('toggleState', 'dispatch', (state = false, action) => {
switch( action.type ) {
case 'SHOW':
return true;
case 'HIDE':
return false;
case 'TOGGLE':
return !state;
default:
return state;
}
}, false),
withHandlers({
toggle: ({ dispatch }) => (e) => dispatch({ type: 'TOGGLE' }),
show: ({ dispatch }) => (e) => dispatch({ type: 'SHOW' }),
hide: ({ dispatch }) => (e) => dispatch({ type: 'HIDE' })
})
); const Statue = withToggle(
({ status, toggle, toggleState }) =>
(<span onClick={() => toggle(!toggleState)}>
{status}
{toggleState && <StatusList/>}
</span>)
); const Tooltip = withToggle(({ show, hide, toggleState, text, children }) => (
<span>
<span>
{toggleState && <div
style={TooltipStyle}>
{ text }
</div>}
<span
onMouseOver={show}
onMouseOut={hide}
>
{ children }
</span>
</span>
</span>
)); const User3 = withConfig(({ status, name, config }) => (
<div style={UserStyle}>
<Tooltip text="Cool Dude!">{name}</Tooltip>-
{config.showStatus && <Statue status={status}/>}
{config.canDeleteUsers && <button>X</button> }
</div>
)); export default User3;
最新文章
- 关键字static(1)
- static 类成员变量 和 static const类成员变量
- Java简单类(部门、领导、雇员关系)
- common.js
- 《NoSQL精粹》思维导图读书笔记
- Codeforces Round #303 (Div. 2) D 贪心
- 得到创建人Id
- power desinger 学习笔记三<;批量执行sql语句>;
- 使用 C# 进行 Outlook 2003 编程
- Linux笔记(固定USB摄像头硬件端口,绑定前后置摄像头)
- TensorFlow + Keras 实战 YOLO v3 目标检测图文并茂教程
- Heap
- Silverlight网页打开后马上崩溃,“白屏”,而且毫无提示
- jmeter测试mysql遇到的问题
- 使用ntlmrelayx在任何地方进行中继凭据
- L2-019. 悄悄关注
- JAVA基础部分复习(三、泛型)
- 伤不起:File.toPath() &; Paths.get()
- 使用新版SDK不想跳转微博客户端能否直接发送微博分享?
- InnoDB 引擎独立表空间