reactReact Native01-混合开发

React Native实战系列第十篇 — 组件生命周期

2017-05-22  本文已影响568人  撩课_叶建华

前言

一、看图分析

react-native组件的生命周期

<p></p>
<p></p>

二、实例化阶段函数功能分析

getDefaultProps

getInitialState

this.setState({
    activePage: activePage, 
    currentX: contentOffSetX  
});

componentWillMount

render

componentDidMount

fetch API来异步请求Web API

<p></p>
<p></p>
<p></p>

三、存在期阶段函数功能分析

componentWillReceiveProps
指父元素对组件的props或state进行了修改

shouldComponentUpdate
一般用于优化,可以返回false或true来控制是否进行渲染

componentWillUpdate
组件刷新前调用,类似componentWillMount

componentDidUpdate
更新后的相关操作

四、销毁期阶段函数功能分析

五、常用知识点分析

this.state

状态更新引起界面更新

<p></p>
<p></p>

六、案例实操——动态添加和删除商品

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

const Dimensions = require('Dimensions');
const {width, height} = Dimensions.get('window');
const dataArr = require('./localData/data.json');

export default class XZHBadgeView extends Component {
    // 构造
    constructor(props) {
        super(props);
        // 初始状态
        this.state = {
            // 组件数组
            shopViewArr: []
        };
    }

    render() {
        return (
            <View style={styles.container}>
                {/*上面的视图*/}
                <View style={styles.topViewStyle}>
                    {/*添加商品*/}
                    <TouchableOpacity
                        onPress={()=>this._addShop()}
                        style={styles.btnStyle}
                    >
                        <Text>添加商品</Text>
                    </TouchableOpacity>
                    {/*删除商品*/}
                    <TouchableOpacity
                        onPress={()=>this._removeShop()}
                        style={[styles.btnStyle, {backgroundColor:'red'}]}
                    >
                        <Text>删除商品</Text>
                    </TouchableOpacity>
                </View>
                {/*下面的视图*/}
                <View style={styles.contentViewStyle}>
                    {this.state.shopViewArr}
                </View>
            </View>
        );
    }

    /**
     * 添加商品
     */
    _addShop(){
        // 1. 总列数 3, 宽度和高度
        let cols = 3, shopW = 100, shopH = 120;

        // 2. 全局的索引
        var index = this.state.shopViewArr.length;

        // 验证
        if(index > dataArr.length - 1){
            alert('不要败家了,够了!');
            return;
        }

        // 3. 根据索引求出当前盒子的行号和列号
        let col = parseInt(index % cols);
        let row = parseInt(index / cols);

        let leftSpace = (width * 0.9 - cols * shopW) / (cols - 1);
        let topSpace = (height * 0.8 - 3 * shopH) / 2;

        let left = (shopW + leftSpace) * col;
        let top = (shopH + topSpace) * row;

        // 4. 创建组件
        let shopView = (
            <View
                style={{
                   position:'absolute',
                   left:left,
                   top:top,
                   justifyContent:'center',
                   alignItems:'center'
                }}
                key={index}
            >
                <Image
                    source={{uri: dataArr[index].icon}}
                    style={{width:shopW, height:shopW}}
                />
                <Text>{dataArr[index].name}</Text>
            </View>
        );

        var tempArr = this.state.shopViewArr;
        tempArr.push(shopView);

        this.setState({
            shopViewArr: tempArr
        });

    }


    /**
     * 删除商品
     */
    _removeShop(){
        
        if(this.state.shopViewArr.length == 0){
            alert('购物车空空如也~');
            return;
        }
        
        var tempArr = this.state.shopViewArr;
        tempArr.pop();
        
        
        this.setState({
            shopViewArr: tempArr
        })
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#e8e8e8',
    },

    topViewStyle: {
       // backgroundColor:'red',
       padding:30,
       flexDirection:'row',
       justifyContent:'space-around'
    },

    btnStyle: {
        width:120,
        height:40,
        backgroundColor:'green',
        justifyContent:'center',
        alignItems:'center',
        borderRadius:10
    },

    contentViewStyle:{
        backgroundColor:'#fff',
        width: width * 0.9,
        height: height * 0.8,
        marginLeft: width * 0.05
    }
});
添加和删除商品

<p></p>
<p></p>
<p></p>
<p></p>

长按图片-->识别图中二维码

近期正在把公众账号的文章转移到简书,如果要了解第一动态,请关注我的微信公众账号,带你从零到一的进行React Native开发实战,在其他文章中会有对应的code和资料发放!

上一篇下一篇

猜你喜欢

热点阅读