React-Native學(xué)習(xí)之路(12) - 用FlatList實(shí)現(xiàn)留言板評(píng)論功能 +(解決鍵盤(pán)跳出舞吭,頂出tabNavigator的問(wèn)題)

(1) 知識(shí)點(diǎn):

  • (1) concat():用于連接兩個(gè)或多個(gè)數(shù)組,返回一個(gè)新的數(shù)組析珊。
   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請(qǐng)求得到的數(shù)據(jù)羡鸥,格式和上面的一樣,
// 只是 content內(nèi)容不一樣忠寻,而且key要不一樣惧浴,這里用i++得到不同的key
  • (2) setState是異步的,所以要用回調(diào)函數(shù)立即取得新的狀態(tài)值后奕剃,要做什么衷旅。。
this.setState({
    _isSending:true
}, () => {
    回調(diào)纵朋,更新?tīng)顟B(tài)后要做的事情
})
  • (2) FlatList的數(shù)據(jù)源格式:
<FlatList
  data={[{key: 'a'}, {key: 'b'}]}
  renderItem={({item}) => <Text>{item.key}</Text>}
/>
----------------------------
可以看到:在flatlist的data數(shù)據(jù)源中柿顶,是一個(gè)對(duì)象數(shù)組,即
[ 
{ key:'01', name:'woow.wu',avatar:'...'} , 
{ key:'02', name:'shengjudao',avatar:'...'}
]
---------------------------
可以看到:在renderItem中操软,帶有參數(shù)item嘁锯,這里要打印item對(duì)象的數(shù)據(jù)結(jié)構(gòu)
   _renderItemHuiFu(data) {
        // console.log(data)
        // liuyan = data
      return(
       <Text>{ data.item.name}</Text>
      )
  • (3) get請(qǐng)求家乘,得到已評(píng)論的數(shù)據(jù)
 _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請(qǐng)求仁锯,提交留言的內(nèi)容翔悠,返回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='請(qǐng)輸入評(píng)論內(nèi)容'
                            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) 提交函數(shù):
 _submit() {
        if(!this.state.content) {
            return alert('留言不能為空')
        }
        if( this.state._isSending){
            return alert('評(píng)論正在提交')
        }
        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請(qǐng)求得到的對(duì)象數(shù)組
                        // 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('評(píng)論正在提交')
        }
        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='請(qǐng)輸入評(píng)論內(nèi)容'
                            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) 鍵盤(pán)跳出戚炫,頂出tabnavigator

(詳細(xì))http://www.reibang.com/p/b877115fff1b
http://blog.csdn.net/u011690583/article/details/53808773

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末双肤,一起剝皮案震驚了整個(gè)濱河市茅糜,隨后出現(xiàn)的幾起案子素挽,更是在濱河造成了極大的恐慌预明,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酥馍,死亡現(xiàn)場(chǎng)離奇詭異物喷,居然都是意外死亡遮斥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)尉辑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)隧魄,“玉大人隘蝎,你說(shuō)我怎么就攤上這事嘱么。” “怎么了几迄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵映胁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我坑填,道長(zhǎng)弛姜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮中剩,結(jié)果婚禮上抒寂,老公的妹妹穿的比我還像新娘。我一直安慰自己郊愧,他們只是感情好井佑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布躬翁。 她就那樣靜靜地躺著,像睡著了一般例嘱。 火紅的嫁衣襯著肌膚如雪宁舰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天腋腮,我揣著相機(jī)與錄音低葫,去河邊找鬼。 笑死实柠,一個(gè)胖子當(dāng)著我的面吹牛善涨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蟹漓,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼葡粒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼膜钓!你這毒婦竟也來(lái)了颂斜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盒让,失蹤者是張志新(化名)和其女友劉穎司蔬,沒(méi)想到半個(gè)月后俊啼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搓谆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年泉手,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偶器。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缝裤。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憋飞,死狀恐怖榛做,靈堂內(nèi)的尸體忽然破棺而出内狸,到底是詐尸還是另有隱情,我是刑警寧澤锰瘸,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布避凝,位于F島的核電站眨补,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏佩谣。R本人自食惡果不足惜实蓬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一吊履、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酌伊,春花似錦缀踪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至咒精,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間模叙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工查吊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逻卖,地道東北人昭抒。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓灭返,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親罚缕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怎静,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容