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. ASP.NET Core 基于JWT的认证(一)

    ASP.NET Core 基于JWT的认证(一) Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计 ...

  2. C# 把字符串类型日期转换为日期类型(转载)

    C# 把字符串类型日期转换为日期类型   来源:https://www.cnblogs.com/raincedar/p/7009243.html 方法一:Convert.ToDateTime(stri ...

  3. eclipse复制粘贴变卡的解决办法

    参考这个:https://www.cnblogs.com/o-andy-o/p/4108955.html

  4. SpringBoot JPA(实现查询多值)

    JPA是java Persistence API简称,中文名:java持久层API,JPA是JCP组织发布的J2EE标准之一 1.创建DataSource连接池对象 <dependency> ...

  5. 1920*1080pc端适配

    (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ' ...

  6. SpringBoot热部署-解决方案

    在SpringBoot中启用热部署是非常简单的一件事,因为SpringBoot为我们提供了一个非常方便的工具spring-boot-devtools,我们只需要把这个工具引入到工程里就OK了,下面我就 ...

  7. 在chrome 怎么通过ajax请求加载本地文件

    在chrome下面用Jquery 的load方法加载本地的html文件时会报错 我百度了一下是因为 谷歌浏览器内核为了安全机制,不允许这样方式访问其他页面,但是可以通过加 --enable-file- ...

  8. apache环境下ssl证书链不完整问题解决,原因是缺少中间证书

    事情的起因是,对一个网站的升级,从http升级到https,苹果手机可以正常访问,唯独安卓手机出现空白,安卓访问https的时候是出现的空白. 服务器的系统是windows Server 2008 R ...

  9. Ruby入坑指南

    1.1 简介 Ruby语言是由松本行弘(Matz)设计,是一门通用的.面向对象的.解释型语言. 1.2 Ruby?RUBY?ruby? 1.Ruby:用来表示编程的语言 2.ruby:是指一个计算机程 ...

  10. Centos7安装搜狗输入法.

    系统默认安装输入法管理器的是 ibus. 而搜狗使用 fcitx 1.以我们先要安装 fcitx和必要的软件包 yum -y install fcitx* yum -y install libQtWe ...