个人博客

你若安好,便是晴天


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 搜索

组件之navigator、ListView

发表于 2017-04-14 | 分类于 ReactNative

Navigator

使用导航器可以让你在应用的不同场景(页面)进行切换。导航器通过不同路由来分辨不同的场景。
利用renderScene方法,导航栏可以指定的路由来渲染场景

可以通过configureScene属性获取指定路由对象的配置信息,从而改变场景的动画或者手势。查看
navigator.SceneConfigs来获取默认的动画和更多的场景配置选项。

注意:这个组件本文说明简单,但使用上有一定难度。

在使用该组件时,一般需要以下几步:

  1. 属性:

  • configScene (function)

    可选的函数,用来配置场景动画和手势。会带有两个参数调用,一个是当前路由,一个是当前的路由栈,
    然后它返回一个场景配置对象。

  • initialRoute (object)

    定义启动加载的路由,路由是导航栏用来识别渲染场景的一个对象,initialRoute必须是initialRouteStack
    中的一个路由。initialRoute默认是initialRouteStack中最后一项。

  • initialRouteStack (object)

    提供一个路由集合用来初始化。如果没有设置初始路由的话必须设置初始路由。如果没有提供该属性,它将默认被设置
    成一个只含有initialRoute的数组。

  • navigationBar (node)

    可选参数,提供一个在场景切换的时候保持的导航条。

  • navigator (object)

    可选参数,提供从父容器获得的导航器对象。

  • onDidFocus (function)

    每当导航条切换完成或者初始化之后,调用此函数,参数为新场景的路由。

  • onWillFocus (function)

    会在导航条切换之前调用,参数为目标路由。

  • renderScene (function)

    必要参数。用来渲染指定参数路由的场景。调用的参数是路由和导航器。

  • senceStyle (View#style)

    将会应用在每个场景容器上的样式。

ListView

核心组件,用于高效地显示一个可以垂直滚动的变化的数据列表。最基本的使用方式就是创建一个
ListView.DataSource数据源,然后给它传递一个普通的数据数组,再使用数据源实例化一个ListView组件
,并且定义它的回调函数_renderRow。该函数会接受数组中每个数据作为参数。返回一个可渲染的组件。

ListView还支持一些高级特性,这个本人还没有尝试,以后详解哈。

属性:

  • renderRow (function)

    从数据源中接收一条数据,以及和它所在的section的ID。返回一个可渲染的组件来为这行数据进行渲染。默认情况下
    参数中的数据就是放进数据源的数据本身,不过也可以提供一些转换器。

    如果某一行正在被高亮(通过调用highlightRow函数),ListView会得到相应的通知。当一行被高亮时,其两侧的分割线
    会被隐藏。行的高亮状态可以通过调用highlistRow(null)来重置。

  • renderHeader (function)

    渲染页头。

  • renderSeparator (function)

    如果提供了此属性,一个可渲染的组件会被渲染在每一行的下面。除了小节标题的前面的最后一行。在其上方的小节ID和行ID,以及
    邻近的行是否被高亮会作为参数被传递进来。

例子:

/**
 * 猫眼电影列表页
 * 数据
 * http://m.maoyan.com/movie/list.json?type=hot&offset=0&limit=1000
 */

import React, { Component } from 'react';
import {
    ListView,
    ActivityIndicator,
    View,
    Text,
    Image,
    StyleSheet
} from 'react-native';

// 引入猫眼数据
import movieData from './../public/json/maoyan.json';

export default class MoveList extends Component {
    constructor(props) {
        super(props);
        var ds = new ListView.DataSource({
            rowHasChanged: (oldData, newData) => oldData !== newData
        });
        this.state = {
            dataSource: ds
        };
    }

    _renderHeader() {
        return (
            <View style={ styles.header }>
                <Text style={ styles.header_txt }>猫眼热门电影</Text>
            </View>
        );
    }

    _renderRow(movie) {
        return (
            <View style={ styles.row }>
                <View style={ styles.left }>
                    <Image source={{ uri: movie.img }} style={ styles.img }></Image>
                </View>
                <View style={ styles.right }>
                    <Text style={[ styles.nm, styles.txt_right ]}>{ movie.nm }</Text>
                    <Text style={[ styles.dir, styles.txt_right ]}>导演:{ movie.dir }</Text>
                    <Text style={[ styles.rt, styles.txt_right ]}>上映时间:{ movie.rt }</Text>
                </View>
            </View>
        );
    }

    _renderSeparator() {
        return (
            <View style={ styles.separator }></View>
        );
    }

    componentDidMount() {
        // 把已经解析好的数据使用到我们的页面
        var ds = new ListView.DataSource({
            rowHasChanged: (oldData,newData) => oldData !== newData
        });
        this.setState({
            dataSource: ds.cloneWithRows(movieData.data.movies)
        });
    }

    render() {
        return (
            <ListView
                style={ styles.container }
                dataSource={ this.state.dataSource }
                renderHeader={ this._renderHeader }
                renderRow={ this._renderRow }
                renderSeparator={ this._renderSeparator }
            >

            </ListView>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        marginTop: 25,
        marginLeft: 10,
        marginRight: 10,
    },
    header: {
        height: 50,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: 'pink',
        borderRadius: 6,
    },
    header_txt: {
        fontSize: 30,
        color: 'darkgrey'
    },
    row: {
        height: 160,
        flexDirection: 'row',
        marginTop: 10,
    },
    left: {
        width: 110,
    },
    right: {
        justifyContent: 'center',
    },
    separator: {
        height: 2,
        backgroundColor: '#ccc'
    },
    img: {
        width: 100,
        height: 150,
    },
    txt_right: {
        marginBottom: 10
    },
    nm: {
        fontSize: 26,
        fontWeight: 'bold',
    },
    dir: {
        fontSize: 16,
        color: 'orange'
    },
    rt: {
        color: 'grey'
    }
});

提示 有关猫眼数据,可点击链接接收JSON数据:http://m.maoyan.com/movie/list.json?type=hot&offset=0&limit=100【limit=?,这里输入的是你要获取电影信息的条目数,最多只能获取100条】

效果图:
alt

常见的Angular疑问解答

发表于 2017-04-13 | 分类于 AngularJS

列举你所知道的angular指令(不少于10个)

  1. ng-bind
  2. ng-model
  3. ng-app
  4. ng-controller
  5. ng-init
  6. ng-repeat
  7. ng-hide
  8. ng-show
  9. ng-if
  10. ng-keydown

请写出一个双向数据绑定的例子

<div ng-app="myApp" ng-init="name='John'">
    <p>姓名:<input type="text" ng-model="name"></p>
    <p>你输入的姓名:{{ name }}</p>
</div>

请列举写出angular的事件绑定,要求事件触发时会有相应的方法执行

<body ng-app="myApp" ng-controller="myCtrl">
    <button ng-click="handler()"></button>
    <p ng-show="isShow">隐藏/显示</p>
    <script>
        var app = angular.module('myApp', []);
        app.controller('myCtrl', function ($scope) {
            $scope.isShow = true;
            $scope.handler = function () {
                $scope.isShow = !$scope.isShow;
            }
        });
    </script>
</body>

请举例写出angular自定义指令的方法

app.directive('helloWorld', function () {
    return (
        template: '<h1>自定义指令</h1>'
    );
});

请举例写出angular发请求的方法(如,发请求到http://localhost:8080/req),并写出返回的数据怎么得到

$http({
    method: 'GET'.
    url: 'http://localhost:8080/req',
}).then(function (res) {
    // 成功的回调
    console.log(res.data);
}, function (err) {
    // 失败的回调
    console.log(err);
});

ng-show/ng-hide 与 ng-if 的区别?

ng-show/ng-hide: 显示或者隐藏HTML元素
ng-if: 如果条件为false移除HTML元素,如果条件为true,会添加移除元素,并显示。
两者之间最大的区别就是ng-hide是隐藏而ng-if是对DOM进行移除

解释下什么事$rootScope 以及和 $scope 的区别?

scope是angularJS中作用域(其实就是存储数据的地方),很类似javascript的原型链。搜索的时候,
优先找自己的scope,如果没有找到就沿着作用域链向上搜索,直至到达根作用域rootScope。

$rootScope是由angularJS加载模块的时候自动创建的,每个模块只会有1个rootScope。rootScope创建
好会以拂去的形式加入到$injector中。也就是说通过$injector.get(‘$rootScope’);能够获取到某个
模块的根作用域。更准确的来说,$rootScope是由angularJS的核心模块ng创建的。

scope是html和单个controller之间的桥梁,数据绑定就靠它了。rootScope是各个controller中
scope的桥梁。用rootScope定义的值,可以在各个controller中使用。

Angular Directive中restrict 中分别可以怎样设置?

restrict中可以分别设置:
A 匹配属性
E 匹配标签
C 匹配Class
M 匹配注释
AECM 混合匹配

ng-click中写的表达式,能使用JS原生对象上的方法吗?为什么?如果不能该如何实现?

不能使用,首先它们两个的作用域是不同,ng-click的作用域是在Angular特有的控制器内的,angular的所有的方法和属性都在控制器中的$scope中,而原生的作用域是全局的。

如何实现:我们可以在ng-click表达式中调用$scope存在的方法名,然后再改方法名中可以调用JS原生对象的方法。

举例说明:

<div app="myApp" controller="myCtrl">
    <p ng-click="handler()">找你零钱:{{ money }}</p>
</div>

<script>
    var app = angular.module('myApp', []);
    app.controller('myCtrl', function ($scope) {
        $scope.money = 3.33;
        $scope.handler = function () {
            // 这里使用JS原生的parseInt()方法
            return parseInt($scope.money);
        }
    });

</script>

angular中的$http是什么,有什么特点?

$http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据。(类似jquery的$.ajax的对象)
特点:
可以在响应返回时用then方法来处理回调。如果使用then方法,会得到一个特殊的参数,
它代表了相应对象的成功或失败信息,还可以接受两个可选的函数作为参数。或者可以使用success和error回调代替。

react

发表于 2017-04-13 | 分类于 ReactNative

hello world, i from react.md

12345
王康

王康

你若安好,便是晴天

13 日志
5 分类
5 标签
GitHub Weibo
Links
  • MacTalk
  • Title
© 2016 - 2017 王康
Hexo
主题 - NexT.Pisces