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 -D

css-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 换成 fontSizetext-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项目总结的更多相关文章

  1. H5项目常见问题汇总及解决方案(果断复制粘贴,不解释)

    H5项目常见问题及注意事项 Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" co ...

  2. 如何开发H5项目 -- 入门篇

    前言 H5即HTML5,H5开发具有低成本.高效率.跨平台.研发周期短,用户接触成本低等特性. 一.开发环境 在开发一个H5项目之前,需要先搞好环境.主要有node.npm.gulp.bower.下面 ...

  3. H5项目常见问题

    转自 https://github.com/FrontEndZQ/HTML5-FAQH5项目常见问题及注意事项 Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面//一.HTML页 ...

  4. H5项目常见问题汇总及解决方案

    H5项目常见问题汇总及解决方案 H5   2015-12-06 10:15:33 发布 您的评价:       4.5   收藏     4收藏 H5项目常见问题及注意事项 Meta基础知识: H5页 ...

  5. 近期H5项目开发小结

    前言:2016差不多又过了半啦,最近参与了公司好几个h5项目(严格来说,也只能算是推广页面活动).主要是新品牌的推广需要,当然也有给公司以前老客户做的案例.今天主要总结下为新品牌开发的2个h5推广:就 ...

  6. 总结- H5项目常见问题汇总及解决方案(转)

    H5项目常见问题及注意事项 Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" co ...

  7. 基于Vue+VueRouter+ModJS+Fis3快速搭建H5项目总结

    技术选型 • 框架 - Vue+VueRouter • 相比较于react/angular/avalon ? • 简单轻量,社区配套完整• 模块化 - ModJS • 相比较于require/seaj ...

  8. nginx部署h5项目

    1. nginx部署h5项目 此为windows部署,liunx也类似的 1.1. 前言 部署h5项目还是很简单的,不过对小白来讲一开始可能也是一脸懵逼,这个简单教程针对的是从未部署过前后端分离前端项 ...

  9. 使用vue-cli3快速适配H5项目

    跟我老大学到了一招使用vue-cli3快速适配H5项目的方法. 我之前也有进行一个版本的适配,直接使用cnpm install -g vue-cli,然后安装各种插件进行适配,见我之前的博客. 后来老 ...

随机推荐

  1. 第一册:lesson 113.

    原文:Small changes. question:Who has got some small changes? Fares,please! Trafalgar Square,please. I' ...

  2. nginx系列9:HTTP反向代理请求处理流程

    HTTP反向代理请求处理流程 如下图:

  3. 解释器模式 Interpreter 行为型 设计模式(十九)

      解释器模式(Interpreter)   考虑上图中计算器的例子 设计可以用于计算加减运算(简单起见,省略乘除),你会怎么做?    你可能会定义一个工具类,工具类中有N多静态方法 比如定义了两个 ...

  4. SpringIOC/DI(2)

    2019-03-08/09:24:37 开发环境:IDEA 1.创建Spring项目 File--New--project--Spring--Creat empty Spring-config.xml ...

  5. 持续集成之 Spring Boot 实战篇

    本文作者: CODING 用户 - 何健 这次实战篇,我们借助「CODING 持续集成」,实现一个简单的 Spring Boot 项目从编码到最后部署的完整过程.本教程还有 B 站视频版,帮助读者更好 ...

  6. “宇宙最强” IDE,Visual Studio 2019 正式发布

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 本文由葡萄城翻译并发布 今天凌晨Visual Studio 2019已经正式发布,现在已经可以下载了.使用V ...

  7. 重庆3Shape CAMbridge都有哪些功能

    三维打印技术创新领导者Objet Geometries公司和牙科领域三维扫描仪.CAD/CAM软件解决方案供应商3Shape A/S公司日前宣布两家公司合作研发的牙科领域三维修复解决方案已付诸实施.此 ...

  8. Linux查看监听端口的脚本测试

    本文是按照lfree的博客(https://www.cnblogs.com/lfree/p/10368332.html)中的内容,进行学习.测试.总结的.有些知识点也是在阅读这篇博文时,发现不了解这方 ...

  9. mysql字段约束

    为了确保数据的完整性和唯⼀性,关系型数 据库通过约束机制来实现目. 一. unique 唯一性约束    : 值不可重复: 二. not null    非空约束    : 值不可为空: 三. def ...

  10. 64位Win7下Asp.net项目连接Oracle时报ORA-6413:连线未打开异常

    当时小弟碰到这个问题的时候,也找了挺久的回答,但是回答都是模棱两可的说是因为()的问题,但是没有给出具体的解决方案,这里小弟就用一个比较笨的方法来解决这个问题. 第一种:就是使用本地IISWeb服务器 ...