组件化思路:以selection为例子,使用prop-types实现组件化控制,重用
需求
书接上文,UI 积累之select section
这里又来两个需求了。
当我点击选择了option后,我应该看到的是我选择的option的内容
多例重用,即同样是个selection,我只是需要改点东西,其他不变,比如selection里面的字内容,font-size, font-family, selection的width, height等。。。如何只开发一个组件就满足这个“无理要求”呢?
第一只老虎--显示option内容
我们的dom是这样的:
<Selectsection>
<select>
<option>Please select one option...</option>
<option>...</option>
<option>...</option>
</select>
<span>Please select one option...</span>
<div></div>
</Selectsection>
具体实现,通过react的state倒是能很简单实现。
给select绑定个onChange事件,触发onSelect方法,当选择select的option的时候,把选到的值传给真正显示的span
问题来了:1)怎么拿。 2)怎么给
1)怎么拿:
点击的时候,通过event.target.value拿到选中的option的值
2)怎么给:
在组件渲染的时候,constructor里的state定义一个值存放选中的值,叫showValue,当选择时,在onSelect方法里,拿到event.target.value后,set给这个值,同时dom中的span进行this.state.showValue值绑定。
Talk is cheap, show me the code
完整代码如下:
class Selection extends Component {
constructor(props){
super(props)
this.state = {
showValue: "Please select one option..."
}
}
onSelect(e){
this.setState({showValue: e.target.value});
}
render() {
return (
<Selectsection>
<select onChange={this.onSelect.bind(this)}>
<option>Please select one option...</option>
<option>...</option>
<option>...</option>
</select>
<span>{this.state.showValue}</span>
<div></div>
</Selectsection>
);
}
}
实例图:
第二只老虎--组件化
看上面的代码可以知道,引入这个selection的方式是这样的
render(
<Selection />
)
但是你这个selection啊,我同一个页面要引入N个,其中一个高度要是40px,另一个宽度要长点,500px,还有一个长宽都不用变,你给我变下这个selection的default的字啊,不叫Please select one option..., 叫什么Please kindly select one option...,还有一个,你给我保持原样不变哈,谢谢了。
WTF, 怎么做呢?
需求啊,莫得办法
为了开发方便,我自己设计,要是能组件化,几个属性在引入的时候可以选择性定义就好了,比如:
render(
<div>
<Selection />
<Selection width="500px" />
<Selection height="40px" />
<Selection wordings="Please kindly select one option..."/ />
</div>
)
能这么实现就完美了。
怎么做呢,这就要引入一个包,叫prop-types了,定义属于这个组件的变量,然后将其运用到组件的每个dom的css上。
接下来以上述为例子。
定义属于这个组件的类型:
Selection.propTypes = {
height: PropTypes.oneOfType([
PropTypes.number,
PropTypes.string,
]),
width: PropTypes.oneOfType([
PropTypes.number,
PropTypes.string,
]),
words: PropTypes.string
}
Selection.defaultProps = {
height: '30px',
width: '300px',
words: 'Please select one option...'
}
然后就是通过react的this.props引入啦
Talk is cheap, show me the code
index.js
class App extends Component {
render() {
return (
<div>
<Selection />
<Selection height="40px" />
<Selection width="500px" />
<Selection words="Please kindly select one option..." />
</div>
);
}
}
Selection.js
class Selection extends Component {
constructor(props){
super(props)
this.state = {
showValue: this.props.words
}
}
onSelect(e){
this.setState({showValue: e.target.value});
console.log(e.target.value)
}
render() {
const { width, height } = this.props
const style = {
width: width,
height: height
}
const suitableHeight = (parseInt(height.substring(0, height.length-2)) - 30) / 2 + 6;
const spanStyle = {
width: width,
height: height,
paddingTop:suitableHeight
}
const arrowStyle = {
top:suitableHeight
}
return (
<Selectsection style={style}>
<select onChange={this.onSelect.bind(this)} value={this.state.showValue} style={style}>
<option>{this.props.words}</option>
<option>...</option>
<option>...</option>
</select>
<span style={spanStyle}>{this.state.showValue}</span>
<div style={arrowStyle}></div>
</Selectsection>
);
}
}
Selection.propTypes = {
height: PropTypes.oneOfType([
PropTypes.number,
PropTypes.string,
]),
width: PropTypes.oneOfType([
PropTypes.number,
PropTypes.string,
]),
words: PropTypes.string
}
Selection.defaultProps = {
height: '30px',
width: '300px',
words: 'Please select one option...'
}
效果图:
hm。。。应该差不多了,这里代码里就忽略了
自定义属性时候纯数字和字符串的判断
当height是比30小的时候的判断处理
有兴趣自己加
ok,完美收工
组件化思路:以selection为例子,使用prop-types实现组件化控制,重用的更多相关文章
- iOS组件化思路 <转>
随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间的代码耦合,为了更好 ...
- iOS组件化思路-大神博客研读和思考
一.大神博客研读 随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间的 ...
- Android基于代理的插件化思路分析
前言 正常的App开发流程基本上是这样的:开发功能-->测试--->上线,上线后发现有大bug,紧急修复---->发新版本---->用户更新----->bug修复.从发现 ...
- 修饰模式(Decorator结构化)C#简单的例子
修饰模式(Decorator结构化)C#简单的例子 播放器的基本功能是移动.执行等.BaseAbility 新增功能:1.伤害技能harmAbility:2.阻碍技能BaulkAbility:3.辅助 ...
- vue父组件异步传递prop到子组件echarts画图问题踩坑总结
效果图: 大致思路:考虑到5张图都是折线图,所以准备用一个子组件承接echarts画图,然后父组件通过prop传递不同数据来展示不同的图 踩坑问题: 1.引入line子组件,画了5个元素,但是只显示一 ...
- DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件
一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...
- WeCenter 社交化问答社区程序 | WeCenter 是一款知识型的社交化问答社区程序,专注于社区内容的整理、归类、检索和再发行
WeCenter 社交化问答社区程序 | WeCenter 是一款知识型的社交化问答社区程序,专注于社区内容的整理.归类.检索和再发行 为什么选择 WeCenter 程序? 让您的社区更智能地运作,强 ...
- Blazor组件自做二 : 使用JS隔离制作手写签名组件
Blazor组件自做二 : 使用JS隔离制作手写签名组件 本文相关参考链接 JavaScript 模块中的 JavaScript 隔离 Viewer.js工程 Blazor组件自做一 : 使用JS隔离 ...
- Vue组件化应用构建 官网例子 Unknown custom element: <todo-item>
[博客园cnblogs笔者m-yb原创,转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] htt ...
随机推荐
- centos7 国内镜像yum安装mysql5.7
我这里是采用纯净的系统,刚装的centos7,而且选择的最小安装所以基本上是什么环境都没有的,然后这篇文章主要针对于小白 检查mysql环境是否已存在 虽然我的是纯净系统,但别人的不能保证,为了避免发 ...
- Andriod常用控件介绍&相关属性(初学方便查询)
一.TextView(显示控件) android:id(给当前控件定义唯一的标识符)——示例:android:id = "@+id/text_view" android:layou ...
- 跨域问题与SpringBoot解决方案
什么是跨域? 定义:浏览器从一个域名的网页取请求另一个域名下的东西.通俗点说,浏览器直接从A域访问B域中的资源是不被允许的,如果想要访问,就需要进行一步操作,这操作就叫"跨域".例 ...
- Linux安装vmtools工具
1.vmware菜单中虚拟机下安装vmtools: 2.将/mnt/cdrom/下的文件copy至可读写的文件夹下,此处我选择downloads目录下(如果提示此文件夹只为可读文件夹时) 3.使用ta ...
- SSH(struts+spring+hibernate)常用配置整理
SSH(struts+spring+hibernate)常用配置整理 web.xml配置 <?xml version="1.0" encoding="UTF-8&q ...
- Linux把内存挂载成硬盘提高读写速度
tmpfs是一种虚拟内存文件系统正如这个定义它最大的特点就是它的存储空间在VM里面,这里提一下VM(virtual memory),VM是由linux内核里面的vm子系统管理,现在大多数操作系统都采用 ...
- 学习python-20191208(2)-Python Flask高级编程开发鱼书_第03章_数据与flask路由
视频06: 定义静态方法的两种方式: 1.在方法上方加上装饰@staticmethod 2.在方法上方加上装饰@classmethod 方法中要加参数cls 如:def search_by_isb ...
- discount the possibility|pessimistic|bankrupt|
Nor can we discount the possibility that some factor in the diet itself has harmful effects. ADJ-GRA ...
- IE11阅读视图:带给你静心饕餮阅读大餐的片刻
编者按:又到读书日,今天你挤出时间读书了吗?如今,越来越多人在习惯电子阅读,然而总难逃眼花缭乱的干扰信息.Internet Explorer 11新增阅读视图功能,一键开启,给你带给你静心饕餮阅读大餐 ...
- perf4j+spring+aop 配置 注解方式
今天将perf4j基于spring aop方式进入了接入,接入方法还是比较简单.具体配置如下: logback.xml <!--perf4j配置--> <appender name= ...