RN实战阶段小结-小项目:书籍列表和展示

这个项目对应的场景对于我们应用开发来说很常见:

1. 通过网络api或其他途径获取到数据源(是一个列表)

2. 通过一个列表简单呈现主要信息,列表可点击进入浏览详情

3. 详情页面接收了来自上个页面传递来的数据,并作一个相对完整的展示;那么这个过程中自然就需要一个导航栏

截图如下:

其中所使用的主要rn技术点归纳如下:

1. 通过fetch函数进行网络请求。

   _refreshData() {
        fetch(ENDPOINT)
            .then((response) => response.json())
            .then((rjson) => {
                this.setState({
                    dataSource1: this.state.dataSource1.cloneWithRows(rjson.results.books)
                });
            });
    }

该函数在componentDidMount中被调用。

2.导航栏实现,并通过它来传值(类似iOS中那种一直在上面显示的导航条);注意,这里使用的是rn提供的跨平台导航器Navigator。

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 */

import React, { Component } from 'react';
import { AppRegistry, StyleSheet, Text, View, Image, ListView , TextInput, Platform, TouchableOpacity, Navigator} from 'react-native';

import NoteMain from './NoteMain';

// 设置默认的路由,也就是ROOTNAV的第一个vc.
const defaultRoute =
{
    component: NoteMain,
    title: "列表页"
};

class rootNav extends Component
{
    // 绘制场景的方法; 可以得到路由和nav的实例;这里从route获取到component (route对象内有很多内容,全部传递给component);
    // 同时将navigator作为属性继续传递到vc中,否则后续vc无法调用this.props.navigator
    // 注意,这里的info为空,暂时没有传递任何数据。
    _renderScene(route, navigator)
    {

        console.log ('_renderSceneing in rootNav');
        console.log(route);
        console.log(route.info);
        let Component = route.component;
        return (
            <Component {...route.info} navigator={navigator} />
        );
    }

    // 绘制navBar,并在每一个nav下的页面展示
    _renderNavBar()
    {
        const styles =
        {
            title:
            {
                flex: 1, alignItems: 'center', justifyContent: 'center'
            },
            button:
            {
                flex: 1, width: 50, alignItems: 'center', justifyContent: 'center'
            },
            buttonText:
            {
                fontSize: 18, color: '#FFFFFF', fontWeight: '400'
            }
        }

        var routeMapper = {
            LeftButton(route, navigator, index, navState) {
                console.log ('index='+ index);
                if(index > 0)
                {
                    return (
                        <TouchableOpacity
                            onPress={() => navigator.pop()}
                            style={styles.button}>
                            <Text style={styles.buttonText}>Back</Text>
                        </TouchableOpacity>
                    );
                }
            },
            // 这个目前没有卵用,等后面加的时候再看。
            RightButton(route, navigator, index, navState)
            {
                // 默认的pop
                if(index > 0 && route.rightButton)
                {
                    return (
                        <TouchableOpacity
                            onPress={() => navigator.pop()}
                            style={styles.button}>
                            <Text style={styles.buttonText}></Text>
                        </TouchableOpacity>
                    );
                }
                else
                    {
                    return null
                }

            },
            Title(route, navigator, index, navState) {
                return (
                    <View style={styles.title}>
                        <Text style={styles.buttonText}>{route.title}</Text>
                    </View>
                );
            }
        };

        return (
            <Navigator.NavigationBar
                style={{
                    alignItems: 'center',
                    backgroundColor: '#55ACEE',
                    shadowOffset:{
                        width: 1,
                        height: 0.5,
                    },
                    shadowColor: '#55ACEE',
                    shadowOpacity: 0.8,
                }}
                routeMapper={routeMapper}
            />
        );
    }

    render()
    {
        console.log ('app rendering');
        return (
            <Navigator
                initialRoute={defaultRoute}
                renderScene={this._renderScene}
                sceneStyle={{paddingTop: 64}}
                navigationBar={this._renderNavBar()}
            />
        );
    }

}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
    },
    instructions: {
        textAlign: 'center',
        color: '#333333',
        marginBottom: 5,
    },
});

3. listview的简单使用,在列表元素中使用TouchableOpacity来响应事件;
4. view/image/text/touchableopacity的简单使用和嵌套;

5. 结合flex和width/height进行布局; style实现样式;...的方式来快速传值(属性);

6. 注意this的传递,在不使用箭头函数绑定的情况下,函数内容若要使用this则需要在外部bind(this).

7. 何时封装组件;如何封装简单组件;PropTypes来限定类型。

主要技术点就这些,是一个最基础的实现,代码大约300多行,这里的api需要翻墙才能访问(iOS项目还需要在plist里面允许http访问)。

时间: 2024-12-29 15:58:51

RN实战阶段小结-小项目:书籍列表和展示的相关文章

基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用_javascript技巧

在上篇基于BootStrap Metronic开发框架经验小结[一]框架总览及菜单模块的处理,介绍了Bootstrap开发框架的一些基础性概括,包括总体界面效果,以及布局.菜单等内容,本篇继续这一主题,介绍页面内容常用到的数据分页处理,以及Bootstrap插件JSTree的使用. 在数据的界面显示当中,表格数据的展示以及分页是非常常见的处理操作,利用Bootstrap的样式布局,以及JQuery的Ajax数据处理,就能很好实现数据的动态展示和分页处理. 1.列表展示和分页处理1)数据的列表展示

业余小项目——tzxblog博客系统

使用spring boot作为后台创建的博客小项目 项目说明 这是一个模拟的博客系统,旨在练习spring boot等知识点的应用,以java后端为主,某些地方可能会显得是为了应用而应用. 前端技术在于简单练习和熟悉,参考价值可能不是太大. 同时,本项目希望努力做成一个方便本地使用的文件管理系统,包含单不限于博客文章.pdf书籍阅读.资料管理等功能 github源代码地址 https://github.com/tuzongxun/tzxblog 基础环境和相关技术说明 java 版本1.8 后台

jquery移动点击的项目到列表最顶端的方法_jquery

本文实例讲述了jquery移动点击的项目到列表最顶端的方法.分享给大家供大家参考.具体实现方法如下: <ul> <li>one</li> <li>two</li> <li>three</li> </ul> 如果点击two,则two这一行会移动到列表的最上方 $("li").click(function() { $(this).parent().prepend($(this)); }); 希望

一台物理机开三台虚拟机做hadoop的小项目,请问hadoop要选什么模式的?

问题描述 一台物理机开三台虚拟机做hadoop的小项目,请问hadoop要选什么模式的? 最近刚刚着手,准备在电脑上用VM装三台虚拟机网上看到hadoop的运行模式有独立.伪分布.全分布模式请问我初期学习的时候要用什么模式的?项目开发后期需不需要再修改成其他模式? 解决方案 1)独立模式:在本机模式下测试和调试,适宜用在开发阶段.2)伪分布模式:hadoop守护进程运行在本机上,模拟一个小规模的集群.3)全分布模式:守护进程运行在一个集群上,生产模式 解决方案二: 有三台虚拟机,当然就是全分布模

nginx lua 小项目:根据 user_agent 显示不同的页面,附带和 php 性能的对比

怎么快速学习一门新的语言呢? 如果你已经熟练掌握了一门语言,那么其他语言都是想通的.一个小小的需求,可能会遇到很多问题,但是搜索相关的关键字,就能快速实现出来,完成一个小目标,事半功倍. 死记硬背手册,太枯燥了,反正我是看不下去,不如直接来个小项目. 一个小需求 pc.mobile 一个地址有两套页面,需要在后端根据浏览器的 user_agent 来显示不同的页面. 通过 php 来做,当然可以,但是活动页面访问量一般都比较大,想优化些,所以想尝试下 lua. nginx 安装 lua-ngin

使用javaEE的SSH框架,做的一个小项目出现了奇怪的问题,请求有经验的前辈搭救!!

问题描述 最近刚做好的一个小项目,在我电脑整正常显示,我把项目直接发给一同学,然后他运行可以,但有些地方显示缺出现了问题,例如基本信息管理里面的查询结果,他有些网页不能完全显示,有的又可以,我想问下,这可能是什么问题?我真的无从下手了,求大神指点.我的正常显示:同学的有些网页缺显示不完全:JSP显示结果的部分代码(java后台那部分代码就是查询出符合的记录,并以CclassList输出):<!--查询结果--><c:iftest="${request.CclassList!=n

ITOO---第一阶段小结

ITOO---第一阶段小结            接触编程已经到了第三个年头了,从开始做的练习项目"机房收费系统""新闻发布系统",再到维护"永和收银系统""人事档案管理系统",到这次参加ITOO这个项目学到的知识越来越多遇到的困难也越来越多解决的问题也越来越多.            从面向过程的开发到面向对象的开发,从文档驱动到敏捷开发,从经典三层到分布式用到的技术一步步的提高,我们的成长也越来越快.           

我想要一个关于struts2与jqgrid结合的小项目,可一直弄不出修改功能

问题描述 我想要一个关于struts2与jqgrid结合的小项目,可一直弄不出修改功能 我是参照这个 http://blog.csdn.net/gengv/article/details/5719053来写的 因为以前接触jqgrid不多,又是Java的新手,想求个大神帮我完善一下这个小项目,只需要实现增删改查就可以了,我按照这个连接的大神去写,但我弄不懂他的服务端的java代码怎么写的,我希望能有个大神帮我弄一下他服务器端的大概代码出来,再发一下到小弟的邮箱 lfming1991@sina.c

大产品小项目大流程小细节大框架小设计

网页制作Webjx文章简介:交互设计的大与小(大兵小将). 首先解释一下啊,大兵小将只是借用了下年初热映电影的名字,本文跟该电影没有任何瓜葛.最近在做一些产品的维护项目,实际上在现有成型产品的基础上进行完善.想到最近因一桩桩口水战引出的微创新概念,以及题目中提到的大兵小将,突然觉得最近做的项目情况也是这样一种状态:在大产品下做一些小项目的设计,在大产品的规范性下做一些交互的微创新.于是乎,用了个交互设计之大兵小将作为题目,总结下最近的工作情况和感想.起了名后,突然发现自己也不经意间用了热门概念,