React-Native——html/css
做前端开发,熟悉了HTML+CSS+JS的开发模式,如果不看RN原理,直接用老一套的逻辑思维上手RN,可能会大跌眼镜。高效开发的前提,需要学习并理解RN的原理。本文主要记录内容是,关于RN开发的HTML层面上的问题。
一、RN的HTML
RN提供的组件(在HTML中叫标签)中常用的有:
1.View-视图容器
可用属性
- style={[Styles.nav, { borderColor: '#0ff' }]}
- onLayout={(event) => { this.getViewInfo; }}
- getViewInfo(event){
console.log(event.nativeEvent.layout.height)
}//获取视图容器的宽高属性
2.Text-文本容器
可用属性:
- style={{textAlign:'center'}]}
- numberOfLines={2}
该组件设置固定宽度后超出的文字会在第二行的末尾以省略号
的形式显示
3.TouchableOpacity-按钮/可触发点击事件的区域
可用属性:
- onPress={()=>{this.todo()}}
- activeOpacity={1}
点击触发后内容没有消隐效果
4.ScrollView和FlatList-滚动列表,属性较多,不罗列;
5.Image-图片容器
可用属性:
- source={require('.../.../img/top.png')}
6.Modal-模态框
- 可作为toast的无需操作2秒消失的警告或提示信息
- 也可作为有交互按钮的操作提示对话框;
二、RN的CSS
1.样式声明:
const StylesComponent = StyleSheet.create({
text:{fontSize: 14},
textColor:{color:'#fff'}
});
2.样式使用的四种形式:
<Text style={StylesComponent.text}></Text>
<Text style={{color:'#fff'}}></Text>
<Text style={[StylesComponent.text,{color:'#fff'}]}></Text>
<Text style={[StylesComponent.text,StylesComponent.textColor]}></Text>
3.RN的盒子模型:box-sizing: border-box;
width包括border和padding
4.CSS属性的书写方式为驼峰式,如fontSize;
5.布局方式为flexbox,弹性盒子模型
在 React-Native 中的flexbox 是css3中flexbox的一个子集,并不支持所有的flexbox属性
6.常用的CSS属性:官方给出的全部属性如下,
React-native Valid style props: [
"alignContent",
"alignItems",//父元素的样式,子元素在当前侧轴方向上的对齐方式;如flexDirection为row时,center表示子元素垂直居中;子元素如果设置了alignSelf属性,则会重写该属性
"alignSelf",//子元素的样式,设置该元素单独在侧轴方向上的对齐方式
"aspectRatio",//元素宽高比,RN独有,设置了图片的宽度后,只需设置好这个属性,就不需要设置图片的高度
"backfaceVisibility",
"backgroundColor",
"borderBottomColor",
"borderBottomLeftRadius",
"borderBottomRightRadius",
"borderBottomWidth",
"borderColor",
"borderLeftColor",
"borderLeftWidth",
"borderRadius",
"borderRightColor",
"borderRightWidth",
"borderStyle",
"borderTopColor",
"borderTopLeftRadius",
"borderTopRightRadius",
"borderTopWidth",
"borderWidth",
"bottom",
"color",
"decomposedMatrix",
"direction",
"display",//控制组件显示与隐藏,隐藏后不占位
"elevation",
"flex",
"flexBasis",
"flexDirection",//默认为column,子元素垂直排列,可设置为row,子元素水平排列
"flexGrow",
"flexShrink",
"flexWrap",
"fontFamily",
"fontSize",
"fontStyle",
"fontVariant",
"fontWeight",
"height",
"includeFontPadding",
"justifyContent",
"left",
"letterSpacing",
"lineHeight",
"margin",
"marginBottom",
"marginHorizontal",
"marginLeft",
"marginRight",
"marginTop",
"marginVertical",
"maxHeight",
"maxWidth",
"minHeight",
"minWidth",
"opacity",
"overflow",
"overlayColor",
"padding",
"paddingBottom",
"paddingHorizontal",
"paddingLeft",
"paddingRight",
"paddingTop",
"paddingVertical",
"position",//RN元素定位类型只有两种:relative相对于正常文档流进行偏移;absolute相对于父元素进行绝对定位,不管父元素设置position属性与否;
"resizeMode”,(cover图片铺满)
"right",
"rotation",
"scaleX",
"scaleY",
"shadowColor",
"shadowOffset",
"shadowOpacity",
"shadowRadius",
"textAlign",
"textAlignVertical",
"textDecorationColor",
"textDecorationLine",
"textDecorationStyle",
"textShadowColor",
"textShadowOffset",
"textShadowRadius",
"tintColor",
"top",
"transform",transform:[{rotate:'30deg'},{translate:[-waterMarkW,0]}]
"transformMatrix",
"translateX",
"translateY",
"width",
"writingDirection",
"zIndex"
]
三、常规布局方案
1.需求一:
- 布局为flex布局
- 子元素水平布局
- 并且会每三个元素自动换行
- 两边间距10px
- 中间间距16px;
Label组件实现代码如下:
class Label extends Component {
constructor(props) {
super(props);
this.state = {
selected: false,
};
}
clicked() {
if (this.state.selected) {
this.setState({
selected: false,
});
} else {
this.setState({
selected: true,
});
}
}
render() {
return (
<TouchableOpacity onPress={() => { this.clicked(); }} activeOpacity={1}>
<View
style={{
borderWidth: D(1),
width: D(64),
height: D(24),
borderRadius: D(2),
alignItems: 'center',
justifyContent: 'center',
marginTop: D(16),
backgroundColor: this.state.selected ? '#fff' : '#f5f5f5',
borderColor: this.state.selected ? '#ff6700' : '#f5f5f5',
marginRight: (this.props.index + 1) % 3 == 0 ? D(10) : D(16),
}}
>
<Text
style={{
color: this.state.selected ? '#ff6700' : '#757575',
}}
>{this.props.item}
</Text>
</View>
</TouchableOpacity>
);
}
}
2、maxWidth失效
布局如下,maxWidth失效:
<View style={{ maxWidth: 100 }}>
<Text>123</Text>
</View>
改变方案如下,maxWidth生效:
<View style={{ flexDirection: 'row', justifyContent: 'flex-start' }}>
<View style={{ maxWidth: 100 }}>
<Text>123</Text>
</View>
</View>
生效原因,改变了主轴的方向
,flex水平布局时maxWidth才会生效,但flex默认为垂直布局;
3.、获取TextInput对象
<TextInput
onChange={(e) => { this.onChange(e); }}
ref="textInput"
/>
onChange(e) {
console.log(e);// {eventCount:'',target:'',text:''}
}
四、获取组件的宽高和位置信息
react-native 获取组件的尺寸有两种方式:
第一种方式使用元素自身的onLayout属性去获取
但是这种方式有一个局限性:
- 只有在
初次渲染
的时候才会触发这个函数, - 此种方法获取的是
组件相对于父组件的位置坐标
。
第二种方式,使用react-native中的findNodeHandle和UIManager来获取组件的尺寸
这里封装一个layout的函数,当我们需要获取组件的宽度和高度或者位置信息时,就可以通过调用这个函数去获取。
layout
函数接受一个ref参数
,这个参数表示组件的实例,传入组件的实例后,然后通过findNodeHandle方法获取组件节点。UIManager.measure
接受两个参数,第一个参数是通过
findNodeHandle获取的组件节点
第二个参数是获取成功的
回调
- 回调有6个参数:
x,y表示组件的相对位置
width,height表示组件的宽度和高度
pageX,pageY表示组件相对于屏幕的绝对位置。
- 回调有6个参数:
import { findNodeHandle, UIManager } from 'react-native';
<TextInput
onChange={(e) => { this.onChange(e); }}
ref="textInput"
/>
onChange(e) {
this.layout(this.refs.textInput)
.then((item) => {
console.log(item);// 可以在then回调中同步获取数据{x,y,width,height,pageX,pageY}
});
}
layout(ref) {
const handle = findNodeHandle(ref);
return new Promise((resolve) => {
UIManager.measure(handle,
(x, y, width, height, pageX, pageY) => {
resolve({
x, y, width, height, pageX, pageY,
});
});
});
}
React-Native——html/css的更多相关文章
- React Native 中 CSS 的使用
首先声明,此文原作者为黎 跃春 React Native中CSS 内联样式 对象样式 使用Stylesheet.Create 样式拼接 导出样式对象 下面的代码是index.ios.js中的代码: / ...
- React Native 简介:用 JavaScript 搭建 iOS 应用 (1)
[编者按]本篇文章的作者是 Joyce Echessa--渥合数位服务创办人,毕业于台湾大学,近年来专注于协助客户进行 App 软体以及网站开发.本篇文章中,作者介绍通过 React Native 框 ...
- 如何用 React Native 创建一个iOS APP?
诚然,React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用.在 JavaScript 中用 Reac ...
- React Native backgroundColor 的颜色值
React Native 的 css 跟 web开发中css还是很相似的,其中 backgroundColor 支持的颜色值与 css 一致,为方便查找写在这里. 其他样式可以参考 CSS 样式网站 ...
- React Native 之 Text的使用
前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- React Native:使用 JavaScript 构建原生应用
[转载] 本篇为联合翻译,译者:寸志,范洪春,kmokidd,姜天意 数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生 ...
- React Native 之 View使用
前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...
- react native 中webview内的点击事件传到外部原生调用
先说一下我使用webview的时候遇到的一个功能需求 是这样的,上图中的这个页面是用h5做的,但是由于点击"我的优惠劵"是需要跳转到我原生的页面,也就是说我需要获得这个h5提供的点 ...
- React Native Changed the World? or Nothing.
RN是一个awesome的技术, facebook很有想法的团队创造出一项新的技术改变了native开发界. 但是RN本身又疑点重重, RN是为了解决什么问题而存在的? 在诞生了一年后, RN又解决了 ...
随机推荐
- C++中对C的扩展学习新增语法——作用域运算符::
作用域运算符用来告诉编译器在哪个作用域范围搜索符号,一般分为以下3种: 全局作用域: 命名空间作用域: 类作用域:
- PHP 将数据从 Laravel 传送到 vue 的四种方式
在过去的两三年里,我一直在研究同时使用 Vue 和 Laravel 的项目,在每个项目开发的开始阶段,我必须问自己 “我将如何将数据从 Laravel 传递到 Vue ?”.这适用于 Vue 前端组件 ...
- [高效工作软件] Capslock+的使用笔记 (快捷键)
1.下载https://cjkis.me/capslock+/#%E4%B8%8B%E8%BD%BD,双击即可安装,中文路径也可: 2.这个软件的代码开源了的,以后java学成之后,可以去看看源码: ...
- VS 使用 :新建项目
1.文件位置不放C盘
- idea2017建立jsp工程及tomcat等配置
1:建立工程,选择Java Enterprise,可能需要选择tomcat路径和jdk路径: =============================== 以下作为第二种方式参考: 1:创建新工程 ...
- Docker从入门到实践(2)
二.基本概念 Docker 镜像 我们都知道,操作系统分为内核和用户空间.对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持.而 Docker 镜像(Image),就相 ...
- node.js和ionic
1.安装node.js node -v 检测node文件是否安装成功 node --version 检查node版本号 2.Npm node package manager 管理工具 管理模 ...
- raid10配置流程(5块磁盘)
1.添加5块磁盘 (1)先添加一块磁盘 (2)在此基础上,再添加4块磁盘 2.使用mdadm命令创建RAID10,名称为“/dev/md0” -C 代表创建操作 -v 显示创建过程 ...
- 安装win7和ubuntu16.04双系统
硬件:2012年本子 话硕A55V Service 准备: 首先通过一键还原备份win7系统!不清楚某些失误会不会备份也不能拯救! 清出100g硬盘空间,ubuntu会安装在这里 查看当前win7启 ...
- ef+Npoi导出百万行excel之踩坑记
最近在做一个需求是导出较大的excel,本文是记录我在做需求过程中遇到的几个问题和解题方法,给大家分享一下,一来可以帮助同样遇到问题的朋友,二呢,各位大神也许有更好的方法可以指点小弟一 ...