尝试用React写几个通用组件 - 带搜索功能的下拉列表,开关切换按钮,弹出框

近期正在逐步摸索学习React的用法,尝试着写几个通用型的组件,整体项目还是根据webpack+react+css-medules构建,

项目代码 https://github.com/sunrun93/react-custom-components

启动项目:

git clone git@github.com:sunrun93/react-blog-app.git
npm i
npm start

启动项目后,如若发现本地css未生效,请在node_modules\react-scripts\config\webpack.config.dev.js和node_modules\react-scripts\config\webpack.config.prod.js找到对应的css-loader, 在其options中添加如下两项(modules,localIdentName):

 loader: require.resolve('css-loader'),
options: {
modules: true,
localIdentName: '[name]__[local]__[hash:base64:5]'
}

主要组件包括:

. Search-box:具有输入搜索功能的下拉列表,仅支持单项选中,并可根据用户输入匹配筛选选项,调用方式如下:



let options = [
{ id: '1', label: 'Option-A', value: 'Option-A' },
{ id: '2', label: 'Option-B', value: 'Option-B' },
{ id: '3', label: 'Option-C', value: 'Option-C' },
{ id: '4', label: 'Option-D', value: 'Option-D' }
];
<SearchBox options={options}/> //显示label
Toggle-btn:模仿ios系统中的开关按钮,基于checkbox实现一个toggle-btn的小插件。样式上,隐藏checkbox勾选框的样式,将troggle-btn的样式添加到checkbox的label上:

     <input type="checkbox" checked={this.state.isCheck} className={this.state.isCheck?styles.greenDotRight:styles.greenDotLeft}/>
<label></label>
  input[type='checkbox'] {
visibility:hidden;
position:absolute;
} .greenDotLeft+label{
width:30px;
height: 30px;
border-radius: 15px;
background-color:lightgray;
display: inline-block;
position: absolute;
left: 0;
} .greenDotRight+label{
width: 30px;
height: 30px;
border-radius: 15px;
background-color: lawngreen;
display: inline-block;
position: absolute;
right:0;
}

调用方式如下:

 <ToggleBtn isChecked={isChecked} onClick={toggleEvent}/> //onClick触发想要调用的方法,接受一个参数拿到当前的状态,isChecked可定义初始化的值
dialog-component 弹出框/对话框组件 - 弹出框或者对话框组件在web应用中非常的常见,因此尝试使用react构造一个对话框组件。

首先我们考虑一下两点:

  1. 弹出框显示时,通常情况会生成一个遮罩层,使用户无法触发页面上的其他操作。
  2. 弹出框的DOM节点在根节点生成,显示或关闭不能影响原本的页面结构。

    因此,我们考虑通过两部分来构造这个组件,并通过ReactDOM提供的 ReactDOM.unstable_renderSubtreeIntoContainer方法将其插入到DOM的根节点,结构如下(Layer层为遮罩层,Dialog为我们实际构造的组件):

<Layer>
<Dialog>
/* customer defined dialog content */
</Dialog>
</Layer>

Layer层的具体实现如下,具体请查看

class Layer extends React.Component {
constructor(props) {
super(props);
}
componentDidMount() {
this.renderLayer();
}
componentDidUpdate() {
this.renderLayer();
}
componentWillUnmount() {
this.removeLayer();
}
renderLayer() {
if (!this.props.open) {
this.removeLayer()
} else {
if (!this.layer) {
this.layer = document.createElement("div");
this.layer.className = styles.layer;
document.body.appendChild(this.layer);//首先将Layer节点添加到DOM中
}
ReactDOM.unstable_renderSubtreeIntoContainer(this, this.props.children, this.layer);
//然后通过unstable_renderSubtreeIntoContainer方法将其放到根结点下
}
}
removeLayer() {
if (!this.layer) {
return;
}
ReactDOM.unmountComponentAtNode(this.layer);
document.body.removeChild(this.layer);
this.layer = null;
}
render() {
return null;
}
}

具体实现方式:https://github.com/sunrun93/react-custom-components

尝试用React写几个通用组件 - 带搜索功能的下拉列表,开关切换按钮,弹出框的更多相关文章

  1. 使用react+redux实现弹出框案例

    redux 实现弹出框案例 实现效果,点击显示按钮出现弹出框,点击关闭按钮隐藏弹出框 新建弹出框组件 src/components/Modal.js, 在index.js中引入app组件,在app中去 ...

  2. co-dialog弹出框组件-版本v2.0.0

    co-dialog theme 访问git:co-dialog 版本v2.0.0 主题2 coog.app('.theme2').use({ title: 'JUST CHECKING.', mess ...

  3. ReactNative: 使用弹出框组件ActionSheetIOS组件

    一.简介 在上一篇文章中,详细介绍了对话框组件,除此之外,React-Native系统还给开发者提供了一个弹框框组件ActionSheetIOS组件,它的弹出方式与对框框不同,它是从底部弹出,与iOS ...

  4. 基于Vue.js PC桌面端弹出框组件|vue自定义弹层组件|vue模态框

    vue.js构建的轻量级PC网页端交互式弹层组件VLayer. 前段时间有分享过一个vue移动端弹窗组件,今天给大家分享一个最近开发的vue pc端弹出层组件. VLayer 一款集Alert.Dia ...

  5. vue--vant组件库Dialog弹出框

    安装vant UI框架: cnpm install vant –-save-dev 导入组件-在main.js里: import Vant from 'vant'; import'vant/lib/v ...

  6. 关于隐式创建vue实例实现简化弹出框组件显示步骤

    我们在使用vue写alert组件的时候,经常是定义了一个alert.vue,然后引入alert.vue,然后配置参数等等,非常繁琐,那有没有一种方式可以像window.alert("内容&q ...

  7. bootstrap里面的popover组件如何使鼠标移入可以对弹出框进行一系列的操作

    在bootstrap里面,有一个组件很可爱,它就是popover,它是对标签title属性的优化,奉上连接一枚:http://docs.demo.mschool.cn/components/popov ...

  8. 通用的popupwindow底部弹出框

    前段时间做项目的时候,有几个底部弹出框,当时因为忙着赶进度所有就单独写了好几个popupwindow.后来就想着怎么实现一个通用的PopupWindow工具类 就是在要用到的时候创建该工具类的对象,并 ...

  9. [RN] React Native 封装选择弹出框(ios&android)

    之前看到react-native-image-picker中自带了一个选择器,可以选择拍照还是图库,但我们的项目中有多处用到这个选择弹出框,所以就自己写了一下,最最重要的是ios和Android通用. ...

随机推荐

  1. hdu3555(数位DP dfs/递推)

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submi ...

  2. 04_显示意图打开activity

    实际上用显式意图打开一个activity就很简单了.只需要指定你要打开的这个activity的class就可以了. 需要注意一点的是创建了一个ThirdActivity必须要在清单文件里面声明.如果没 ...

  3. 摘抄 - JavaScript JSON的总结

    JSON 是用于存储和传输数据的格式,通常用于服务端向网页传递数据 什么是 JSON? JSON英文全称 JavaScript Object Notation(JavaScript 对象表示法),是一 ...

  4. HDU1430;魔板(BFS+康托展开)

    传送门 题意 给出初始序列与终止序列,给出三种操作,问最少经过几次操作能使初始->终止,输出操作(字典序最小) 分析 字符串只有8个字符,使用康托展开. 1.BFS将所有序列从"123 ...

  5. MySQL基础 -- 关系代数

    MySQL基础 -- 关系代数 关系代数是一种抽象的查询语言,它用对关系的运算来表达查询.  任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的结果.所以运算对象.运算符.运算结果是运算 ...

  6. bzoj 1084: [SCOI2005]最大子矩阵【dp】

    分情况讨论,m=1的时候比较简单,设f[i][j]为到i选了j个矩形,前缀和转移一下就行了 m=2,设f[i][j][k]为1行前i个,2行前j个,一共选了k个,i!=j的时候各自转移同m=1,否则转 ...

  7. poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】

    扩展BSGS的板子 对于gcd(a,p)>1的情况 即扩展BSGS 把式子变成等式的形式: \( a^x+yp=b \) 设 \( g=gcd(a,p) \) 那么两边同时除以g就会变成: \( ...

  8. P4148 简单题(KDTree)

    传送门 KDTree 修改权值当做插入节点,不平衡就暴力重构,询问的时候判断当前节点代表的矩形是否在询问的矩形的,是的话返回答案,相离返回0,否则的话判断当前点是否在矩形内,然后继续递归下去 //mi ...

  9. Word Cloud (词云) - Python

    >>What's Word Cloud 词云 (Word Cloud)是对文本中出现频率较高的词语给予视觉化展示的图形, 是一种常见的文本挖掘的方法.目前已有多种数据分析工具支持这种图形, ...

  10. 使用jquery进行跨域操作

    ajax默认是不支持跨域操作的,只能提交跨域请求,无法获得响应.而可以用$.getScript()函数来进行跨域操作.代码如下: <button id="btnTest"&g ...