【水滴石穿】react-native-book
先推荐一个学习的地址:https://ke.qq.com/webcourse/index.html#cid=203313&term_id=100240778&taid=1277855849978417&vid=s14139cbg2q
我看了一下,挺全的,我接下来应该会根据这个视频自己做一个App?
这个链接也是我在GitHub上面学习各位可爱的程序员的开源项目的时候看到的,接下来我们先来看这个博主的项目吧~
先放github地址:https://github.com/linchengzzz/rnTest
接下来我们来分析项目
项目运行出来的效果,应该是接口有些问题
接下来我们简单看看代码,发现亮点
//index.js
//这个是根入口文件
/**
* @format
* @lint-ignore-every XPLATJSCOPYRIGHT1
*/
import {AppRegistry} from 'react-native';
// import App from './App';
import App from './views/main.js';
import {name as appName} from './app.json';
AppRegistry.registerComponent(appName, () => App);
我们接下来看main.js
//views/main.js
import React, { Component } from 'react';
import { Icon } from 'react-native-elements';
//引入页面
import AboutPage from './book/about';
import BookPage from './book/index';
import MoviePage from './movie/index';
import BookDetailsPage from './book/detail';
import MovieDetailsPage from './common/webpage';
import { createStackNavigator, createBottomTabNavigator, createAppContainer } from "react-navigation";
//定义切换页面
const bottomTabNavigator = createBottomTabNavigator({
Book: BookPage,
Movie: MoviePage,
About: AboutPage
}, {
defaultNavigationOptions: ({ navigation }) => ({
tabBarIcon: ({ focused, tintColor }) => {
const { routeName } = navigation.state;
let iconName;
if (routeName === 'Book') {
iconName = focused ? 'book' : 'book' ; //可以根据focused更换图标
} else if (routeName === 'Movie') {
iconName = 'movie';
}else{
iconName = 'stars';
}
return <Icon name={iconName} size={25} color={tintColor} />;
},
}),
//定义激活颜色,有的是直接改变图片
tabBarOptions: {
//根据是否激活,改变颜色
activeTintColor: 'tomato',
inactiveTintColor: 'gray',
}
});
// 定义对应页面
const AppStack = createStackNavigator(
{
bottomTabNavigator: {
screen: bottomTabNavigator
},
Details: {
screen: BookDetailsPage,
// navigationOptions: {
// title: "图书详情"
// }
},
MovieDetails:{
screen: MovieDetailsPage,
}
}, {
initialRouteName: "bottomTabNavigator",
// 默认header bar样式配置
defaultNavigationOptions: {
headerTintColor: '#fff',
headerStyle: {
backgroundColor: '#2596f3',
height: 0 //影藏header
}
},
});
const AppContainer = createAppContainer(AppStack);
export default class App extends Component {
render() {
return (
<AppContainer />
);
}
}
分析对应页面
//views/book/about.js
import React, { Component } from 'react';
import { Text, View, ScrollView, StyleSheet } from 'react-native';
export default class About extends Component {
render(){
return (
<ScrollView>
<View style={styles.container}>
<Text style={styles.title}>
App Info
</Text>
<View style={styles.box}>
<Text style={styles.leftTitle}>版本</Text>
<Text style={styles.rightContent}>
v1.1_20190312
</Text>
</View>
<View style={styles.box}>
<Text style={styles.leftTitle}>课程地址</Text>
<Text style={styles.rightContent}>
https://ke.qq.com/webcourse/index.html#cid=203313&term_id=100240778&taid=1278010468801073&vid=e1414ek8gbc
</Text>
</View>
<View style={styles.box}>
<Text style={styles.leftTitle}>依赖组件</Text>
<Text style={styles.rightContent}>
react-native-elements、react-navigation、react-native-webview
</Text>
</View>
<View style={styles.box}>
<Text style={styles.leftTitle}>欠缺功能</Text>
<Text style={styles.rightContent}>
header:目前影藏了,设置了header高度为0
</Text>
</View>
</View>
</ScrollView>
)
}
}
var styles = StyleSheet.create({
container: {
flex: 1,
padding: 10,
marginTop: 0,
lineHeight:30
},
title: {
fontWeight: "bold",
color: "#f33",
fontSize: 20
},
box:{
marginTop:20,
flex:1
},
leftTitle:{
fontSize:18,
color:"#333",
fontWeight:"800",
},
rightContent:{
fontSize:16,
color:"#999"
}
})
//封装的searchBar
//views/common/searchbar.js
import React, { Component } from 'react';
import { Text, View,TextInput, StyleSheet, TouchableOpacity } from 'react-native';
export default class SearchBar extends Component {
render() {
return (
<View style={styles.container}>
<View style={styles.inputContainer}>
<TextInput style={styles.input} {...this.props} />
</View>
<TouchableOpacity style={styles.btn} {...this.props}>
<Text style={styles.search}>搜索</Text>
</TouchableOpacity>
</View>
);
}
}
var styles = StyleSheet.create({
container:{
flexDirection:"row",
justifyContent:"flex-end",
alignItems:"center",
height:44,
marginTop:10
},
inputContainer:{
flex:1,
marginLeft:5
},
input:{
flex:1,
height:44,
borderWidth:1,
borderRadius:4,
borderColor:"#ccc",
paddingLeft:5
},
btn:{
width:55,
height:44,
marginLeft:5,
marginRight:5,
backgroundColor:"#23beff",
borderRadius:4,
justifyContent:"center",
alignItems:"center"
},
search:{
flex:1,
color:"#fff",
fontSize:15,
fontWeight:"bold",
textAlign:"center",
lineHeight:44
}
})
//views/book/index.js
import React, { Component } from 'react';
import { Text, View, ScrollView, Image, StyleSheet,TouchableOpacity } from 'react-native';
import SearchBar from '../common/searchbar';
import Util from '../common/util';
import Api from '../common/api';
export default class index extends Component {
constructor(props) {
super(props);
this.state = {
data: [],
show: true,
keyword: 'react'
};
}
componentDidMount(){
// 初次请求数据
this.getData();
}
updateSearch = search => {
this.setState({ keyword: search });
}
//获取数据
searchText=()=>{
this.getData();
}
// 以下写法报错,不识别this
// searchText (){
// this.getData();
// }
// Util.loading 工具函数定义的loading
getData(){
// 显示loading
this.setState({
show: false
});
// 请求数据
var that = this;
var url = Api.book_search + '?count=20&q=' + this.state.keyword;
Util.getRequest(url, function (response) {
// 请求成功
if (!response.books || response.books.length == 0) {
return alert("未查询到数据");
}
// 显示loading,将请求结果赋值给data
that.setState({
show: true,
data: response.books
});
}, function (error) {
// 请求失败
alert(error);
});
}
render() {
return (
<ScrollView>
{/* 封装的搜索头部 */}
<SearchBar
placeholder="请输入关键词(书名、作者)..."
onChangeText={this.updateSearch}
onPress={this.searchText}
/>
{
// 请求数据时显示loading,请求成功显示列表
this.state.show ?
<View style={styles.container} >
{
this.state.data.map((item, i) => {
return (
<TouchableOpacity style={styles.list} key={i} onPress={() => this.props.navigation.push('Details', { 'bookID': item.id })}
activeOpacity={0.5}>
<Image source={{ uri: item.images.small }} style={styles.images} />
<View style={styles.rightbox}>
<Text style={styles.title}>{item.title}</Text>
<Text>价格:{item.price ? item.price : '暂无'}</Text>
<Text>作者:{
item.author.map(
function(vo){
return vo + ' ';
}
)
}</Text>
<Text>{item.publisher} {item.pubdate}</Text>
<Text>{item.pages ? item.pages : '未知'} 页</Text>
</View>
</TouchableOpacity>
);
})
}
</View>
: Util.loading
}
</ScrollView>
)
}
}
var styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: "center",
padding:10,
marginTop: 0
},
btn:{
width:100,
height:30
},
images: { width: 80, height: 100 },
title:{
fontWeight:"bold",
color:"#f33"
},
rightbox:{
flex:1,
marginLeft:10
},
list:{
flex: 1,
flexDirection: "row",
borderBottomColor: "#ccc",
borderBottomWidth: 1,
paddingTop:10,
paddingBottom:10
}
})
关于详情页
//views/book/detail.js
import React, { Component } from 'react';
import { Text, View, ScrollView, Image, StyleSheet } from 'react-native';
import { Icon,Header,Button } from 'react-native-elements';
import Util from '../common/util';
import Api from '../common/api';
import { TouchableHighlight, TouchableOpacity } from 'react-native-gesture-handler';
export default class BookDetail extends Component {
constructor(props) {
super(props);
this.state = {
bookID: '',
bookData: null
};
}
componentDidMount(){
// bookID = this.props.navigation.getParam('bookID', 26378583);
// this.setState({
// bookID: bookID
// })
this.getData();
}
getData(){
//这个是从后端获取的数据
// var url = Api.book_detail_id + this.state.bookID;
var url = Api.book_detail_id + this.props.navigation.getParam('bookID', 26378583);
var that = this;
Util.getRequest(url,function(data){
that.setState({
bookData: data
})
},function(error){
alert(error);
})
}
render(){
var bookData = this.state.bookData;
return (
<ScrollView>
{
bookData != null ?
<View>
{/* <Button
icon={{
name: "assignment-return",
size: 15,
color: "white"
}}
onPress={() => this.props.navigation.goBack()}
title="返回"
/> */}
<View style={styles.list}>
<Image source={{ uri: bookData.images.small }} style={styles.images} />
<View style={styles.rightbox}>
<Text style={styles.title}>{bookData.title}</Text>
<Text>价格:{bookData.price ? bookData.price : '暂无'}</Text>
<Text>作者:{
bookData.author.map(
function (vo) {
return vo + ' ';
}
)
}</Text>
<Text>{bookData.publisher} {bookData.pubdate}</Text>
<Text>{bookData.pages ? bookData.pages : '未知'} 页</Text>
</View>
</View>
<View style={{ marginTop: 10 }}>
<Text>图书简介</Text>
<Text>{bookData.summary}</Text>
</View>
<View style={{marginTop:10}}>
<Text>作者简介</Text>
<Text>{bookData.author_intro}</Text>
</View>
</View>
: Util.loading
}
</ScrollView>
)
}
}
var styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: "center",
padding: 10,
marginTop: 0
},
btn: {
width: 100,
height: 30
},
images: { width: 80, height: 100 },
title: {
fontWeight: "bold",
color: "#f33"
},
rightbox: {
flex: 1,
marginLeft: 10
},
list: {
flex: 1,
flexDirection: "row",
borderBottomColor: "#ccc",
borderBottomWidth: 1,
paddingTop: 10,
paddingBottom: 10
}
})
【水滴石穿】react-native-book的更多相关文章
- 基于React Native的58 APP开发实践
React Native在iOS界早就炒的火热了,随着2015年底Android端推出后,一套代码能运行于双平台上,真正拥有了Hybrid框架的所有优势.再加上Native的优秀性能,让越来越多的公司 ...
- React Native 之 Text的使用
前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...
- React Native环境配置之Windows版本搭建
接近年底了,回想这一年都做了啥,学习了啥,然后突然发现,这一年买了不少书,看是看了,就没有完整看完的.悲催. 然后,最近项目也不是很紧了,所以抽空学习了H5.自学啃书还是很无趣的,虽然Head Fir ...
- 史上最全Windows版本搭建安装React Native环境配置
史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...
- 【腾讯Bugly干货分享】React Native项目实战总结
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 “8小时内拼工作,8小时外拼成长 ...
- React Native环境搭建以及几个基础控件的使用
之前写了几篇博客,但是没有从最基础的开始写,现在想了想感觉不太合适,所以现在把基础的一些东西给补上,也算是我从零开始学习RN的经验吧! 一.环境搭建 首先声明一下,本人现在用的编辑器是SublimeT ...
- React Native组件介绍
1.React Native目前已有的组件 ActivityIndicatorIOS:标准的旋转进度轮; DatePickerIOS:日期选择器: Image:图片控件: ListView:列表控件: ...
- React Native图片控件的使用
首先定义组件 import { AppRegistry, StyleSheet, Text, View, Image,} from 'react-native'; 然后将render返回中的模版增加I ...
- react-native学习笔记--史上最详细Windows版本搭建安装React Native环境配置
参考:http://www.lcode.org/react-native/ React native中文网:http://reactnative.cn/docs/0.23/android-setup. ...
- windows 7下React Native环境配置
React Native 是 Facebook 推出的一个用 Java 语言就能同时编写 ios,android,以及后台的一项技术,它可以做到实时热更新 .FaceBook 也号称这们技术是 “Le ...
随机推荐
- [Hdu-5155] Harry And Magic Box[思维题+容斥,计数Dp]
Online Judge:Hdu5155 Label:思维题+容斥,计数Dp 题面: 题目描述 给定一个大小为\(N*M\)的神奇盒子,里面每行每列都至少有一个钻石,问可行的排列方案数.由于答案较大, ...
- 2、mysql密码过期的修改方法(your password has expired)
今天打开SQLyog提示密码过期:Your password has expired 解决方法: 1. 启动MySQL服务 2. 启动MySQL后台 3. 执行以下命令 step 1: S ...
- 跟我一起安装vmware
第一步查看我们的电脑配置 我是windows10,下面的方法是windows10来安装vmware 第二步双击下图文件 (1) 2)弹出如下图,点击下一步即可. (3)一直点击下一步(期间会同意,勾选 ...
- BZOJ3907 网格 卡特兰数
题目描述 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m. 现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左 ...
- SQL Server代码如何快速格式化,sqlserver代码
在SQL Server中我们经常需要编写各种SQL脚本,例如存储过程和函数等,由于在编写过程中,经常会进行调整,有些关键字我们用的大写,有的我们用的小写,有的后面结束用:分割有的又没有.对于有强迫症的 ...
- php四种文件加载语句
https://mp.weixin.qq.com/s/Wsn4grDRxVIgMfu__E_oWQ 1.include 2.require 3.include_once 4.require_once ...
- 简单易学的机器学习算法—基于密度的聚类算法DBSCAN
简单易学的机器学习算法-基于密度的聚类算法DBSCAN 一.基于密度的聚类算法的概述 我想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别. ...
- Python学习之--数字转人民币读法(解决问题的方法很重要)
效果图: 实现代码: money = float(input("Please input the money:"))cop = int(money)Num = ['零','壹',' ...
- day65-test
目录 一.点击事件控制标签颜色 二.实现点击次数,变换页面标签的颜色 三.周期性实现颜色的旋转变色 练习题 一.点击事件控制标签颜色 1.有 红.黄.蓝 三个按钮,以及一个200x200矩形框box, ...
- GULP入门(一)
1.首先要先装node.然后在命令行里安装全局的gulp: npm install --global gulp 这是gulp在的生成的位置 2.接下来,我们需要将gulp安装到项目本地 npm ins ...