商誉专题RN及H5项目总结
React(基础框架): React 是基础框架,是一套基础设计实现理念,开发者不能直接使用它来开发移动应用或者网页。
React.js(web网页开发):在React框架之上,发展出了React.js 框架来开发网页。
React Native(移动端应用):在React框架之上,延伸的一个移动应用程序开发框架。
一、react和react-native样式区别
1.在reactjs中的样式,一种是样式需要外部引入css文件,引用样式的方式是在html中的link标签引入;第二种是在js文件中引入,这种方式需要使用css-loader和style-loader
style-loader 能够在需要载入的html中创建一个
<style></style>标签,标签里的内容就是CSS内
npm install style-loader -Dcss-loader 是允许在js中
import一个css文件,会将css文件当成一个模块引入到js文件中。npm install css-loader -D
import "./style.css";//引入css文件
class App extends Component {
render(){
return (
<div className = "container"></div>
);//使用className代替class
}
}
第三种是定义样式对象
在html中行内样式写法:<span style="font-size: 12px; color: #333;">文本</span >
在react中要插入行内样式,需要CSS 属性变成一个对象再传给元素: <span style={{fontSize: 12px; color: #333;}}>文本</span>
style 接受一个对象,这个对象里面是这个元素的 CSS 属性键值对,原来 CSS 属性中带 - 的元素都必须要去掉 - 换成驼峰命名,如 font-size 换成 fontSize,text-align 换成 textAlign
2.在react-native中的样式,有两种,一种是内联样式对象;一种是定义样式对象,这个样式是写在js文件中;两种方式都是以对象的方式来定义样式。
使用style属性来代替class处理样式
export default class App extends Component{
render(){
return (
<View style={[css.container,css.box]}>
<Text style={css.textBox}>测试例子</Text>
</View>
)//使用style
}
}
const css= {
container:{
display: "flex",
flexDirection: "row",
alignItems: "center",
},
box:{
justifyContent: 'flex-start'
},
textBox:{
color:"red",
fontSize: 16,
textAlign: "center",
}
}
对比样式属性:reactjs开发的h5项目可以使用css2,css3所有属性。但是react native属性受限,可用样式参考 https://github.com/doyoe/react-native-stylesheet-guide
动画实现,react native提供 Animated,从实现难以程度,灵活性来看,明显较复杂些。
总结:使用样式对象的方式都需将样式属性 采用驼峰式写法(js引入)。reactjs最终渲染成 css行内定义样式写法。
不同的是
在react、react native 中使用style对象的方式时,值必须用双引号包裹起来。但是属性值有些差别
import React, { Component } from "react";
const divStyle = {
width: "300px",
margin: "30px 50rpx",
backgroundColor: "#44014C", //驼峰法
minHeight: "200px",
boxSizing: "border-box"
};
class App extends Component {
constructor(props, context) {
super(props);
}
render() {
return (
<div>
<div style={divStyle }>我是文字</div>
</div>
);
}
}
export default App
但是在react-native中样式
import React, { Component } from "react";
import {
View,
Text,
StyleSheet
} from "react-native";
export default class extends Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<View>
<Text style={css.divStyle}></Text >
</View>
);
}
}
const css = StyleSheet.create({
divStyle: {
width: 300,
/* margin: "30px 50rpx",*/
marginHorizontal:50,
marginVertical:30,
backgroundColor: "#44014C", //驼峰法
/* minHeight: "200px",*/
/* boxSizing: "border-box" 无boxSizing属性 */
}
}
多个style对象合并
style={{...firstStyle, ...secondStyle}} 或 style={Object.assign({},firstStyle,secondStyle)}
style={[firstStyle,secondStyle]}
二、界面view层
ReactJs和React Native的原理是相同的,都是由js实现的虚拟dom来驱动界面view层渲染,但是渲染方式不同。
ReactJs是驱动html dom渲染;我们可以使用html标签,甚至创建更多的自定义组件标签,内部绑定事件;
React Native 不是使用HTML来渲染App(不是渲染在HTML页面中),框架本身提供了可代替它的类似组件。这些组件映射到渲染到App中的真正的原生iOS和Android UI组件(驱动android/ios原生组件渲染) 。
举例
react native写法
<TouchableWithoutFeedback onPress={this.pressEvent}>
<View style={css.loadMore}>
<Text style={[css.loadText,css.loadMore]}>{text}</Text>
</View>
</TouchableWithoutFeedback>
react native提供的View组件不可点击 , 可使用 Touchable 的方式来实现用户点击事件的包装
reactjs写法
<div onClick={() => this.onClick()}>
<div className="loadMore">
<span className="loadText loadMore">{text}</span>
</div>
</div>
三、路由
目前react native项目中使用的react-navigation
reactjs路由react-router-dom
reactjs路由配置
import React, { Component } from 'react';
import { BrowserRouter as Router, Switch, Route, Redirect } from 'react-router-dom';
import home from "../views/Home";
import detail from "../views/Detail";
export default class RouteConfig extends Component{
render(){
return(
<Router>
<Switch>
<Route path="/" exact component={home} />
<Route path="/home" component={home} />
<Route path="/detail" component={detail } />
<Redirect to="/" />
</Switch>
</Router>
)
}
}
react native路由配置
'use strict';
import React, { Component } from 'react';
import { Easing, Animated,NativeModules } from 'react-native';
import { createStackNavigator } from 'react-navigation';
import Home from './pages/Home';
import Detail from './pages/Detail';
let initialRouteName, MainStack;
export default class App extends Component {
constructor(props) {
super(props)
this.state = {
}
initialRouteName = props.page || 'Home'
MainStack = createStackNavigator(
{
Home: {
screen: Home
},
Detail: {
screen: Detail
}
}
);
}
async componentWillMount(){
}
render() {
// rootProps 启动参数
let rootProps = this.props
return (
<MainStack screenProps={{ rootProps: rootProps}} />
)
}
};
四、跨域
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。
同源(域名、协议、端口均为相同)策略限制了一下行为:
- Cookie、LocalStorage 和 IndexDB 无法读取
- DOM 和 JS 对象无法获取
- Ajax请求发送不出去
react native项目不是基于浏览器端,因此不存在跨域的问题。但是针对h5页面,则会出现跨域。
解决跨域
① jsonp跨域 https://www.npmjs.com/package/jsonp
npm install jsonp -S
在html页面中通过相应的标签从不同域名下加载静态资源文件是被浏览器允许的,所以,,我们常见的做法是动态的创建script标签,再去请求一个带参网址来实现跨域通信
//原生的实现方式
let script = document.createElement('script');
script.src = 'http://www.abc.com/api/getList?pageSize=1&pageNum=20&callback=callback';
document.body.appendChild(script);
function callback(res) {
console.log(res);
}
jquery也支持jsonp的实现方式
$.ajax({
url:'http://www.abc.com/api/getList',
type:'GET',
dataType:'jsonp',//请求方式为jsonp
jsonpCallback:'callback',
data:{
"pageSize":1,
"pageNum":20
}
})
使用这种方式,我们会发现在html页面会增加script标签,这种方式很好用,但是只能实现get请求 ,通过回调函数取得请求接口的数据。
②proxy代理跨域
https://www.npmjs.com/package/http-proxy-middleware
http-proxy-middleware用于后台将请求转发给其它服务器。
例如:我们当前主机A为http://localhost:3000/,现在浏览器发送一个请求,请求接口/api,这个请求的数据在另外一台服务器B上(http://www.abc.com:4000),这时,就可通过在A主机设置代理,直接将请求发送给B主机。
安装
npm install --D http-proxy-middleware
配置
const proxy = require('http-proxy-middleware');
module.exports = function(app) {
app.use(proxy('/api', {
target: 'http://www.abc.com', // 目标服务器 host
changeOrigin: true, // 默认false,是否需要改变原始主机头为目标URL
pathRewrite: { //重写目标url路径。
'^/api': '/' // 重写请求,比如我们源访问的是api/,那么请求会被解析为 /
}
}))
};
比如:某个接口路径为 http://www.abc.com/api/login
接口中的以 /api 会被替换为 / 并且代理路径为 http://www.abc.com/login
测试看代理模式有没有生效,只需看代理的路径是否指向了本地。
相关链接 https://www.cnblogs.com/zuobaiquan01/p/9516292.html
参考链接:https://www.imooc.com/article/21976
商誉专题RN及H5项目总结的更多相关文章
- H5项目常见问题汇总及解决方案(果断复制粘贴,不解释)
H5项目常见问题及注意事项 Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" co ...
- 如何开发H5项目 -- 入门篇
前言 H5即HTML5,H5开发具有低成本.高效率.跨平台.研发周期短,用户接触成本低等特性. 一.开发环境 在开发一个H5项目之前,需要先搞好环境.主要有node.npm.gulp.bower.下面 ...
- H5项目常见问题
转自 https://github.com/FrontEndZQ/HTML5-FAQH5项目常见问题及注意事项 Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面//一.HTML页 ...
- H5项目常见问题汇总及解决方案
H5项目常见问题汇总及解决方案 H5 2015-12-06 10:15:33 发布 您的评价: 4.5 收藏 4收藏 H5项目常见问题及注意事项 Meta基础知识: H5页 ...
- 近期H5项目开发小结
前言:2016差不多又过了半啦,最近参与了公司好几个h5项目(严格来说,也只能算是推广页面活动).主要是新品牌的推广需要,当然也有给公司以前老客户做的案例.今天主要总结下为新品牌开发的2个h5推广:就 ...
- 总结- H5项目常见问题汇总及解决方案(转)
H5项目常见问题及注意事项 Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" co ...
- 基于Vue+VueRouter+ModJS+Fis3快速搭建H5项目总结
技术选型 • 框架 - Vue+VueRouter • 相比较于react/angular/avalon ? • 简单轻量,社区配套完整• 模块化 - ModJS • 相比较于require/seaj ...
- nginx部署h5项目
1. nginx部署h5项目 此为windows部署,liunx也类似的 1.1. 前言 部署h5项目还是很简单的,不过对小白来讲一开始可能也是一脸懵逼,这个简单教程针对的是从未部署过前后端分离前端项 ...
- 使用vue-cli3快速适配H5项目
跟我老大学到了一招使用vue-cli3快速适配H5项目的方法. 我之前也有进行一个版本的适配,直接使用cnpm install -g vue-cli,然后安装各种插件进行适配,见我之前的博客. 后来老 ...
随机推荐
- 【转载】 Sqlserver限制最大占用内存
在Sqlserver数据库管理软件中,Sqlserver对系统内存的管理原则是:按需分配,并且分配完成后为了查询有更好的性能,并不会立即自动释放内存,数据取出后,还会一直占用着内存,所以在Sqlser ...
- Dapper的基本 理论 知识
简述 Dapper是一个轻量级的ORM工具:ORM框架的核心思想是对象关系映射,ORM是将表与表之间的操作,映射成对象和对象之间的操作,就是通过操作实体类来达到操作表的目的.从数据库提取的数据会自动按 ...
- sql 修改、更新、替换 某个字段的部分内容(转载)
来源:https://blog.csdn.net/jiangnanqbey/article/details/81304834 1*.需求 将表(Ws_FormMain)的字段(order_Number ...
- Java Calendar类使用总结
平时在浏览一些网站时,有些网站会显示出当前时间,如现在是xx年xx月xx日 xx时xx分xx秒,在实际的开发过程中,也会涉及到日期和时间的计算,Java中提供了一个专门的类Calendar来处理日期与 ...
- IntelliJ IDEA下如何设置JSP模板
今天在学习Spring MVC知识时,发现自己所用的IntelliJ IDEA中自动生成的JSP文件不支持EL表达式的使用,所以就想导入新的JSP模板,方便以后使用.根据旧模板的提示,如下图 找到Se ...
- Webpack4教程 - 第二部分,使用loader处理scss,图片以及转换JS
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://wanago.io/2018/07/16/webpack-4-course-par ...
- 基于Android的模拟点击探索
前言 压力测试中,一般会用到自动化测试.准备写一个APP,可以记录屏幕上的点击事件,然后通过shell命令来模拟自动执行.shell指令,比较容易实现.那么,关键的一步是获取点击的坐标.对于Andro ...
- Linux下LANMP集成环境中编译增加pdo_odbc模块
linux版本为CentOs6.5,php集成环境为lanmp_v3.1,集成环境中默认的pdo扩展为:mysql, sqlite, sqlite2,现在有需求想链接微软的Access数据库,所以需要 ...
- PMP(第六版)十大知识领域、五大项目管理过程组、49个过程矩阵
今天整理了PMP(第六版)十大知识领域.五大项目管理过程组.49个过程矩阵,分享出来,希望对要考PMP的童鞋有帮助. PS.红字是与第五版的差异 转走请标明出处 https://www.cnblog ...
- Java学习资源整理(超级全面)
这里整理一些自己平常搜集的比较好的关于Java的学习资源,主要包括博客站点.书籍.课程等. 了解Java最新资讯 这部分主要是了解与Java相关的动态以及信息,能够拓展我们的视野以及寻找一些好的ide ...