React-Native学习之路(12) - 用FlatList实现留言板评论功能 +(解决键盘跳出,顶出tabNavigator的问题)

(1) 知识点:

  • (1) concat():用于连接两个或多个数组,返回一个新的数组。
   var item = [{
                            avatar1: "http://dummyimage.com/200x200/f2c779)",
                            date1: "1994-04-20",
                            key: "120000199" + i +"31207725X",
                            name1: "Cynthia Perez",
                            content1:this.state.content
                        }].concat(liuyanContent)   

                        i++;
// liuyanContent是get请求得到的数据,格式和上面的一样,
// 只是 content内容不一样,而且key要不一样,这里用i++得到不同的key
  • (2) setState是异步的,所以要用回调函数立即取得新的状态值后,要做什么。。
this.setState({
    _isSending:true
}, () => {
    回调,更新状态后要做的事情
})
  • (2) FlatList的数据源格式:
<FlatList
  data={[{key: 'a'}, {key: 'b'}]}
  renderItem={({item}) => <Text>{item.key}</Text>}
/>
----------------------------
可以看到:在flatlist的data数据源中,是一个对象数组,即
[ 
{ key:'01', name:'woow.wu',avatar:'...'} , 
{ key:'02', name:'shengjudao',avatar:'...'}
]
---------------------------
可以看到:在renderItem中,带有参数item,这里要打印item对象的数据结构
   _renderItemHuiFu(data) {
        // console.log(data)
        // liuyan = data
      return(
       <Text>{ data.item.name}</Text>
      )
  • (3) get请求,得到已评论的数据
 _getDataHuiFu() {
        fetch('http://rapapi.org/mockjs/22101/api/pinglun/huifu')
            .then( (response) => response.json() )
            .then( (data) => {
                // console.log(data)
                var Mock = MOCK.mock(data).huifulist;
                // console.log(Mock)
                // var mockDataArray = [];
                // mockDataArray = Mock.fuhuilist;
                // console.log(mockDataArray)
                this.setState({
                    huifu: Mock
                })

            } )
            .catch( (err)=> {
                console.error(err)
            })
    }
  • (3) post请求,提交留言的内容,返回seuccess布尔值,为true

  • (4) 提交按钮和留言TextInput框

                    <View style={{margin:16,
                        borderWidth:1,
                        borderColor:'rgba(0,0,0,0.2)',
                        flexDirection:'row',
                        justifyContent:'space-between',
                        borderRadius:4,
                        alignItems:'center'
                    }}>
                        <TextInput
                            placeholder='请输入评论内容'
                            underlineColorAndroid="transparent"
                            keybordType='numeric'
                            style={{height:80,width:width/2,fontSize:17}}
                            multiline={ true }
                            onChangeText={ (text) => {
                                this.setState({
                                    content: text
                                })
                            } }
                        >
                        </TextInput>

                        <TouchableHighlight onPress={ this._submit.bind(this) }>
                            <View style={{
                                width:100,
                                height:72,
                                backgroundColor:'#ff7454',
                                justifyContent:'center',
                                alignItems:"center",
                                borderRadius:4,
                            }}>
                                <Text style={{color:'white',fontSize:17,letterSpacing:20}}>提 交</Text>
                            </View>
                        </TouchableHighlight>
                    </View>
  • (5) 提交函数:
 _submit() {
        if(!this.state.content) {
            return alert('留言不能为空')
        }
        if( this.state._isSending){
            return alert('评论正在提交')
        }
        this.setState({
            _isSending:true
        },() => {
            fetch('http://rapapi.org/mockjs/22101/api/pinglun/huifupost',{
                method:'POST',
                headers: {
                    'Accept':'application/json',
                    'Content-Type':'application/json'
                },
                body:JSON.stringify({
                    'content':this.state.content
                })
            }).then( (response)=> response.json() )
                .then( (data) => {
                    if( data && data.success){
                        var liuyanContent = this.state.huifu;   //get请求得到的对象数组
                        // liuyanContent.map( (item) => {
                        //     ArrayHuiFu.push({
                        //         key: g,
                        //         data: item
                        //     })
                        //     g++;
                        // })
                        // console.log(ArrayHuiFu)
                        var item = [{
                            avatar1: "http://dummyimage.com/200x200/f2c779)",
                            date1: "1994-04-20",
                            key: "120000199" + i +"31207725X",
                            name1: "Cynthia Perez",
                            content1:this.state.content
                        }].concat(liuyanContent)

                        i++;

                        this.setState({
                            huifu:item,
                            _isSending: false
                        })

                    }
                })
        } )
    }

效果图:


效果图

效果图

完整代码:

/**
 * Created by WOOW.WU on 2017/8/1.
 */
/**
 * Created by WOOW.WU on 2017/8/1.
 */
/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    Dimensions,
    ScrollView,
    Image,
    FlatList,
    TextInput,
    TouchableHighlight
} from 'react-native';

const { width, height } = Dimensions.get('window');
import Icon from'react-native-vector-icons/FontAwesome';
import MOCK from 'mockjs'
// pp2={
//     avatar:'http://dummyimage.com/600x300/f7d8d3)'
// }

var i=3;
var ArrayHuiFu = [];
// var liuyan = {};
export default class ff extends Component {
    constructor(props){
        super(props);
        this.state = {
            ping: {},
            huifu: [],
            content:'',
            _isSending: false
        }
    }

    componentDidMount() {
        this._getData()
        this._getDataHuiFu()
    }

    _getData() {
        fetch('http://rapapi.org/mockjs/22101/api/pinglun')
            .then( (response) => response.json() )
            .then( (data) => {
                var pp = MOCK.mock(data).pinglist;
                // var pp2 = MOCK.mock(data);
                // console.log(pp)
                // console.log(pp2)

                this.setState({
                    ping: pp,
                    // ping2: pp2
                })
            } )
            .catch( (err)=> {
                console.error(err)
            })
    }

    _getDataHuiFu() {
        fetch('http://rapapi.org/mockjs/22101/api/pinglun/huifu')
            .then( (response) => response.json() )
            .then( (data) => {
                // console.log(data)
                var Mock = MOCK.mock(data).huifulist;
                // console.log(Mock)
                // var mockDataArray = [];
                // mockDataArray = Mock.fuhuilist;
                // console.log(mockDataArray)
                this.setState({
                    huifu: Mock
                })

            } )
            .catch( (err)=> {
                console.error(err)
            })
    }


    _renderItemHuiFu(data) {
        // console.log(data)
        // liuyan = data
      return(
          <View style={{ padding:16,flexDirection:'row',justifyContent:'flex-start'}}>
              <View style={{ width:60,}}>
                  <Image source={{ uri: data.item.avatar1}} style={{ width:60,height:60,borderRadius:30}}></Image>
              </View>

              <View style={{paddingLeft:10}}>
                  <Text style={{fontSize: 18 }}>{data.item.name1}</Text>
                  <Text style={{ fontSize:18 ,lineHeight:30,width:width-102}}>{ data.item.content1 }</Text>
                  <Text>{ data.item.date1 }</Text>
              </View>


          </View>
      )
    }

    _submit() {
        if(!this.state.content) {
            return alert('留言不能为空')
        }
        if( this.state._isSending){
            return alert('评论正在提交')
        }
        this.setState({
            _isSending:true
        },() => {
            fetch('http://rapapi.org/mockjs/22101/api/pinglun/huifupost',{
                method:'POST',
                headers: {
                    'Accept':'application/json',
                    'Content-Type':'application/json'
                },
                body:JSON.stringify({
                    'content':this.state.content
                })
            }).then( (response)=> response.json() )
                .then( (data) => {
                    if( data && data.success){
                        var liuyanContent = this.state.huifu;
                        // liuyanContent.map( (item) => {
                        //     ArrayHuiFu.push({
                        //         key: g,
                        //         data: item
                        //     })
                        //     g++;
                        // })
                        // console.log(ArrayHuiFu)
                        var item = [{
                            avatar1: "http://dummyimage.com/200x200/f2c779)",
                            date1: "1994-04-20",
                            key: "120000199" + i +"31207725X",
                            name1: "Cynthia Perez",
                            content1:this.state.content
                        }].concat(liuyanContent)

                        i++;

                        this.setState({
                            huifu:item,
                            _isSending: false
                        })

                    }
                })
        } )
    }

    render() {
        // console.log(this.state.huifu)
        // console.log(pp2.avatar)
        // console.log(this.state.ping2)
        // console.log(this.state.ping2.pinglist)
        // console.log(this.state.ping2.pinglist)
        // console.log(this.state.ping2.pinglist.avatar1)

        return (
            <View style={styles.container}>
                <View style={ styles.myCircle } >
                    <Text style={ styles.myCircleText }>我的圈子</Text>
                    <Icon name="angle-right" size={ 30 } color="black"></Icon>
                </View>

                <ScrollView
                    automaticallAdjustContentInsert = { false }
                    style={ styles.ScrollView}
                >
                    <View style={ styles.infoBox }>
                        <View style={ styles.infoxBoxTop}>
                            <Image style={ styles.avatar } source={{ uri : this.state.ping.avatar1 }}></Image>
                            <Text style={ styles.name1}>{this.state.ping.name1}</Text>
                        </View>
                        <View style={styles.infoxContentContainer}>
                            <Text style={ styles.infoxContent }>{ this.state.ping.content1 }</Text>
                        </View>
                        <View>
                            <Text style={ styles.infoxDate }>{ this.state.ping.date1 }</Text>
                        </View>
                    </View>
                    <View style={{margin:16,
                        borderWidth:1,
                        borderColor:'rgba(0,0,0,0.2)',
                        flexDirection:'row',
                        justifyContent:'space-between',
                        borderRadius:4,
                        alignItems:'center'
                    }}>
                        <TextInput
                            placeholder='请输入评论内容'
                            underlineColorAndroid="transparent"
                            keybordType='numeric'
                            style={{height:80,width:width/2,fontSize:17}}
                            multiline={ true }
                            onChangeText={ (text) => {
                                this.setState({
                                    content: text
                                })
                            } }
                        >
                        </TextInput>

                        <TouchableHighlight onPress={ this._submit.bind(this) }>
                            <View style={{
                                width:100,
                                height:72,
                                backgroundColor:'#ff7454',
                                justifyContent:'center',
                                alignItems:"center",
                                borderRadius:4,
                            }}>
                                <Text style={{color:'white',fontSize:17,letterSpacing:20}}>提 交</Text>
                            </View>
                        </TouchableHighlight>
                    </View>
                    <FlatList
                        data= { this.state.huifu }
                        renderItem = { this._renderItemHuiFu }
                    >
                    </FlatList>


                </ScrollView>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    infoxContentContainer: {
        marginTop:10,
        marginBottom:10
    },
    infoxDate: {
        fontSize: 16
    },
    infoxContent: {
        fontSize: 18,
        lineHeight:36
    },
    name1: {
        fontSize: 20
    },
    infoBox: {
        padding:16,
        borderBottomColor: 'rgba(0,0,0,0.1)'
    },
    infoxBoxTop: {
        flexDirection:'row',
        justifyContent:'flex-start',
        alignItems:'center'
    },
    avatar: {
        width:100,
        height:100,
        borderRadius:50,
        marginRight: 10
    },
    myCircleText: {
        fontSize: 18
    },
    myCircle: {
        height: 60,
        width: width,
        backgroundColor: 'rgba(0,0,0,0.1)',
        flexDirection: 'row',
        justifyContent:'space-between',
        alignItems:'center',
        paddingLeft: 20,
        paddingRight: 20
    },
    container: {
        flex: 1,
        backgroundColor: '#F5FCFF',
    },
});

(2) 键盘跳出,顶出tabnavigator

(详细)http://www.jianshu.com/p/b877115fff1b
http://blog.csdn.net/u011690583/article/details/53808773

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容