React-Native 之 項(xiàng)目實(shí)戰(zhàn)(一)

前言


  • 本文有配套視頻,可以酌情觀看拇惋。
  • 文中內(nèi)容因各人理解不同,可能會(huì)有所偏差抹剩,歡迎朋友們聯(lián)系我撑帖。
  • 文中所有內(nèi)容僅供學(xué)習(xí)交流之用,不可用于商業(yè)用途澳眷,如因此引起的相關(guān)法律法規(guī)責(zé)任胡嘿,與我無關(guān)。
  • 如文中內(nèi)容對您造成不便钳踊,煩請聯(lián)系 277511806@qq.com 處理衷敌,謝謝。
  • 轉(zhuǎn)載麻煩注明出處拓瞪,謝謝缴罗。

ES5轉(zhuǎn)ES6


項(xiàng)目簡介


  • 先來看下我們仿照的這款A(yù)PP的效果:
最終效果圖.gif
  • 從上圖中矢空,我們可以看出復(fù)雜度并不大,但是時(shí)間關(guān)系我們盡量將所有的模塊都做完禀横,并完善細(xì)節(jié)屁药。

譯注:

  • 建議打開 視頻 配合 文字 學(xué)習(xí),以免有某些細(xì)節(jié)文中沒有提到柏锄,但以文中內(nèi)容為準(zhǔn)(根據(jù)反饋進(jìn)行相應(yīng)更新)

  • 之所以選擇這款A(yù)PP酿箭,和我個(gè)人的愛好有關(guān),當(dāng)然關(guān)鍵還是因?yàn)檫@個(gè)APP整體并不復(fù)雜趾娃,包含了市面上常見APP的樣式缭嫡,并且很順利地就獲取到所有請求參數(shù)和圖片資源,很適合我們體驗(yàn) React-native 大致的開發(fā)流程抬闷。

項(xiàng)目分析


  • 在開發(fā)APP前妇蛀,產(chǎn)品經(jīng)理大致會(huì)進(jìn)行需求的分析,然后開會(huì)討論開發(fā)過程中需要使用到的技術(shù)笤成、會(huì)遇到的難點(diǎn)评架、分配相應(yīng)任務(wù)、傾聽開發(fā)人員意見并進(jìn)行相應(yīng)的修改炕泳,最終確定整體原型圖纵诞、開發(fā)流程、技術(shù)培遵、周期等等浙芙,當(dāng)然其中還有UI的介入,我們沒有產(chǎn)品經(jīng)理籽腕,UI也有現(xiàn)成的嗡呼,所以大致給大家劃分以下幾塊:

    • 需求分析:這款A(yù)PP主要是通過抓取各大電商平臺(tái)的 商品優(yōu)惠信息 進(jìn)行篩選、分類并最終展現(xiàn)給用戶节仿,使用戶可以方便晤锥、快捷、實(shí)時(shí)的獲取高質(zhì)量的優(yōu)惠信息廊宪。

    • 開發(fā)模型:我們這邊類似基于 原型模型 開發(fā)矾瘾。

    • 使用的技術(shù):React-Native

    • 功能模塊:主要分為 首頁、海淘模塊箭启、小時(shí)風(fēng)云榜 三大模塊等其它附屬模塊(酌情增加)壕翩。

    • 整體架構(gòu):

      • 主體:由 TabBar 作為主體框架,以 首頁傅寡、海淘模塊放妈、小時(shí)風(fēng)云榜 為整體模塊北救,根據(jù) 原型圖 的效果選擇相應(yīng)的跳轉(zhuǎn)方式
      • 數(shù)據(jù)展示:根據(jù) 原型圖 選擇相應(yīng)的數(shù)據(jù)展示方式
    • 命名規(guī)則:參考 編碼規(guī)范文檔(不同公司之間都有差異,具體看公司提供的文檔芜抒,這邊先遵守下面提到的規(guī)則即可)

  • 測試:MDZZ珍策,誰測試→→!

工程環(huán)境配置


  • 所有需要用到的資源點(diǎn)擊下載宅倒。

  • 首先攘宙,來配置 iOS 端。

  • 將壓縮包內(nèi)的 Images.xcassets 文件夾直接替換掉我們iOS工程中的 Images.xcassets 文件夾拐迁。

  • 這時(shí)候我們可以看到所有圖片資源已經(jīng)成功導(dǎo)入到iOS工程中蹭劈,接著我們點(diǎn)擊工程文件進(jìn)行一些必要的配置。

  • General —— App Icons and Launch Images —— 修改 Launch Images SourceImages.xcassets 文件夾內(nèi)的 LaunchImage 线召,清除 Launch Screen File 內(nèi)容铺韧。

  • General —— Deployment Info —— Device Orientation —— 只保留 Portrait 選項(xiàng)。

  • 打開 info.plist 文件缓淹,找到 Bundle name 選項(xiàng)哈打,將其內(nèi)容修改為 逛丟學(xué)習(xí)

  • 打開 info.plist 文件,找到 App Transport Security Settings 選項(xiàng)割卖,給其添加 Allow Arbitrary Loads 選項(xiàng)并設(shè)置內(nèi)容為 YES (如果使用 IPV6標(biāo)準(zhǔn) 可以忽略這一步)

  • OK,至此 iOS 端配置完畢前酿。

iOS配置后效果.gif
  • 接著,來配置 Android 端鹏溯。

  • 將壓縮包內(nèi)的 drawable-xxhdpi 文件夾復(fù)制粘貼到 GD/android/app/src/main/res/ 中。

  • 設(shè)置 APP圖標(biāo) 進(jìn)入 GD/android/app/sec/ 打開 AndroidManifest 文件淹仑,修改 android:icon 項(xiàng)丙挽,如下:

        <applicatio>
            android:icon="@drawable/icon"
        </application>
    
    
  • 設(shè)置 APP名稱 進(jìn)入 GD/android/app/src/main/res/values/ 中,打開 strings.xml 文件匀借,做如下修改:

        <resources>
            <string name="app_name">逛丟學(xué)習(xí)</string>
        </resources>
    
  • OK,至此 Android 配置完畢颜阐。

Android配置后效果.gif

目錄結(jié)構(gòu)與命名規(guī)則


  • 為了方便理解,我們這邊先不按照常規(guī)的React-native開發(fā)結(jié)構(gòu)進(jìn)行開發(fā)吓肋,后續(xù)章節(jié)再慢慢轉(zhuǎn)變
  • 這邊我們將文件分為 main(入口)凳怨、home(首頁)、ht(海淘)是鬼、hourList(小時(shí)風(fēng)云榜) 4大部分肤舞,將相關(guān)的文件放入對應(yīng)的文件夾,避免開發(fā)中頻繁切換文檔給新手帶來煩躁感
  • 命名規(guī)則:
    • 文件夾命名方式我們就跟著 React-Native 默認(rèn)的方式均蜜,采用 小寫 + 下劃線 進(jìn)行命名
    • 文件命名方式我們采用 前綴(大寫) + 模塊名稱(帕斯卡) 的方式進(jìn)行命名
    • 函數(shù)李剖、常量、變量等使用 駝峰命名規(guī)則

目錄結(jié)構(gòu):

譯注:

  • 駝峰命名規(guī)則:首字母小寫囤耳,后續(xù)單詞以大寫開頭篙顺,詳情點(diǎn)擊 駝峰命名 查看閱讀偶芍。
  • 帕斯卡命名規(guī)則:和駝峰類似,只不過將首字母改為大寫德玫,詳情點(diǎn)擊 帕斯卡命名 查看閱讀匪蟀。
  • 下劃線命名規(guī)則:就是使用下劃線分割單詞。

第三方框架


  • 這邊來講下在 React-Native 中怎么導(dǎo)入第三方框架

  • 首先宰僧,第三方框架肯定是要到 GitHub 找嘍材彪。

  • 在搜索框內(nèi)搜索 react-native-tab-navigator

  • 在下面的 說明 中告訴我們了撒桨,使用終端 —— 進(jìn)到工程的主目錄下 —— 復(fù)制命令行()—— 回車 —— 等待下載完成就導(dǎo)入到工程中了查刻。

  • 到此,第三方框架導(dǎo)入完成凤类,使用在下面會(huì)提到穗泵。

主體框架搭建


  • 上面提到使用 TabBar 作為主體框架,但是官方只提供了iOS端的 TabBarIOS 谜疤,時(shí)間原因?yàn)榱思涌扉_發(fā)進(jìn)度佃延,并且順帶講解 第三方框架使用 所以我們使用 <react-native-tab-navigator>進(jìn)行開發(fā)

  • 既然要使用框架,肯定要先引入框架文件夷磕。

   // 引用第三方框架
   import TabNavigator from 'react-native-tab-navigator';
  • 根據(jù) 使用說明 文檔可以看出履肃,使用方法和官方的 TabBarIOS 類似(不清楚的麻煩參考React Native 之 TabBarIOS和TabBarIOS.Item使用),所以我們把 三大模塊 添加進(jìn)TabBar坐桩,并且各個(gè)模塊都是以 Navigator 的形式存在尺棋。
    export default class GD extends Component {

    // ES6
    // 構(gòu)造
      constructor(props) {
        super(props);
        // 初始狀態(tài)
        this.state = {
            selectedTab:'home',
        };
      }

    // 返回TabBar的Item
    renderTabBarItem(title, selectedTab, image, selectedImage, component) {
        return(
            <TabNavigator.Item
                selected={this.state.selectedTab === selectedTab}
                title={title}
                selectedTitleStyle={{color:'black'}}
                renderIcon={() => <Image source={{uri:image}} style={styles.tabbarIconStyle} />}
                renderSelectedIcon={() => <Image source={{uri:selectedImage}} style={styles.tabbarIconStyle} />}
                onPress={() => this.setState({ selectedTab: selectedTab })}>
                    // 添加導(dǎo)航功能
                <Navigator
                        // 設(shè)置路由
                    initialRoute={{
                        name:selectedTab,
                        component:component
                    }}
                        
                    renderScene={(route, navigator) => {
                        let Component = route.component;
                        return <Component {...route.params} navigator={navigator} />
                    }}
                />
            </TabNavigator.Item>
        );
    }

    render() {
        return (
            <TabNavigator>
                {/* 首頁 */}
                {this.renderTabBarItem("首頁", 'home', 'tabbar_home_30x30', 'tabbar_home_selected_30x30', Home)}
                {/* 海淘 */}
                {this.renderTabBarItem("海淘", 'ht', 'tabbar_abroad_30x30', 'tabbar_abroad_selected_30x30', HT)}
                {/* 小時(shí)風(fēng)云榜 */}
                {this.renderTabBarItem("小時(shí)風(fēng)云榜", 'hourlist', 'tabbar_rank_30x30', 'tabbar_rank_selected_30x30', HourList)}
            </TabNavigator>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    tabbarIconStyle: {
        width:Platform.OS === 'ios' ? 30 : 25,
        height:Platform.OS === 'ios' ? 30 : 25,
    }
});

  • 至此,主體框架搭建完畢绵跷。
主體框架效果.gif

自定義導(dǎo)航欄樣式


  • 從效果圖中可以看出膘螟,導(dǎo)航欄的樣式都差不多,因?yàn)槲覀兦懊嬉呀?jīng)設(shè)置了 Navigator 碾局,這邊的話我們還需要自定義 Navigator 的樣式荆残,可以看到所有的 Navigator 樣式都是相近的,所以這邊我們就抽出來净当,讓所有的 Navigator 共用一個(gè)組件就可以了内斯。

  • 那么首先我們在 main 文件夾中創(chuàng)建 GDCommunalNavBar 文件并初始化一下里面基本的內(nèi)容

  • 接著,我們來看下首頁的導(dǎo)航欄像啼,首頁導(dǎo)航欄分別有左中右三個(gè)按鈕俘闯,左邊為半小時(shí)熱門,中間為點(diǎn)擊下拉顯示支持篩選的平臺(tái)的列表埋合,右邊則是商品搜索备徐,通常 Navigator 也只有這3個(gè)組件,為了使用者高度地自定義甚颂,這邊我們只在 currencyNavBar 中設(shè)置3個(gè)組件的布局蜜猾,然后提供接口秀菱,獲取外部傳入的值,并在內(nèi)部判斷是否需要?jiǎng)?chuàng)建相應(yīng)的組件蹭睡。

    
    export default class GDCommunalNavBar extends Component {

    static propTypes = {
        leftItem:PropTypes.func,
        titleItem:PropTypes.func,
        rightItem:PropTypes.func,
    };

    // 左邊
    renderLeftItem() {
        if (this.props.leftItem === undefined) return;
        return this.props.leftItem();
    }

    // 中間
    renderTitleItem() {
        if (this.props.titleItem === undefined) return;
        return this.props.titleItem();
    }

    // 右邊
    renderRightItem() {
        if (this.props.rightItem === undefined) return;
        return this.props.rightItem();
    }

    render() {
        return (
            <View style={styles.container}>
                {/* 左邊 */}
                <View>
                    {this.renderLeftItem()}
                </View>
                {/* 中間 */}
                <View>
                    {this.renderTitleItem()}
                </View>
                {/* 右邊 */}
                <View>
                    {this.renderRightItem()}
                </View>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        width:width,
        height:Platform.OS === 'ios' ? 64 : 44,
        backgroundColor:'white',
        flexDirection:'row',
        justifyContent:'space-between',
        alignItems:'center',
        borderBottomWidth:0.5,
        borderBottomColor:'gray',
        paddingTop:Platform.OS === 'ios' ? 15 : 0,
    },
});

  • 這邊我們就已經(jīng)完成了 Navigator 的樣式衍菱,我們到首頁來用一下,看好不好用肩豁,使用這邊就不說了(1.引用外部文件脊串;2.<CommunalNavBar ...參數(shù)/>)

![Upload 自定義Navigator樣式.gif failed. Please try again.]

首頁半小時(shí)熱門


  • 這邊我們就先從 半小時(shí)熱門 開始,像這樣的數(shù)據(jù)展示清钥,我們肯定是優(yōu)先選擇 ListView 琼锋,其中,cell 的樣式分解如下:
cell樣式.png
  • 我們先將數(shù)據(jù)請求下來祟昭,確定正確獲取到數(shù)據(jù)后缕坎,再來定義 cell 的樣式。

  • 接下來我們來自定義一下 cell 樣式

    
    export default class GDCommunalNavBar extends Component {

    static propTypes = {
        image:PropTypes.string,
        title:PropTypes.string,
    };

    render() {
        return (
            <View style={styles.container}>
                {/* 左邊圖片 */}
                <Image source={{uri:this.props.image}} style={styles.imageStyle} />
                {/* 中間的文中 */}
                <View>
                    <Text numberOfLines={3} style={styles.titleStyle}>{this.props.title}</Text>
                </View>
                {/* 右邊的箭頭 */}
                <Image source={{uri:'icon_cell_rightArrow'}} style={styles.arrowStyle} />
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flexDirection:'row',
        alignItems:'center',
        justifyContent:'space-between',
        backgroundColor:'white',
        height:100,
        width:width,
        borderBottomWidth:0.5,
        borderBottomColor:'gray',
        marginLeft:15

    },

    imageStyle: {
        width:70,
        height:70,
    },
    titleStyle: {
        width:width * 0.65,
    },
    arrowStyle: {
        width:10,
        height:10,
        marginRight:30
    }
});

  • 好了篡悟,到這里 cell 樣式也定義完成并且效果是一樣的谜叹。

    export default class GDHalfHourHot extends Component {

    // 構(gòu)造
      constructor(props) {
        super(props);
        // 初始狀態(tài)
        this.state = {
            dataSource: new ListView.DataSource({rowHasChanged:(r1, r2) => r1 !== r2}),
        };
        // 綁定
        this.fetchData = this.fetchData.bind(this);
      }

    // 網(wǎng)絡(luò)請求
    fetchData() {
        fetch('http://guangdiu.com/api/gethots.php')
            .then((response) => response.json())
            .then((responseData) => {
                this.setState({
                    dataSource: this.state.dataSource.cloneWithRows(responseData.data)
                });
            })
            .done()
    }

    popToHome() {
        this.props.navigator.pop();
    }

    // 返回中間按鈕
    renderTitleItem() {
        return(
            <Text style={styles.navbarTitleItemStyle}>近半小時(shí)熱門</Text>
        );
    }

    // 返回右邊按鈕
    renderRightItem() {
        return(
            <TouchableOpacity
                onPress={()=>{this.popToHome()}}
            >
                <Text style={styles.navbarRightItemStyle}>關(guān)閉</Text>
            </TouchableOpacity>
        );
    }

    // 返回每一行cell的樣式
    renderRow(rowData) {
        return(
            <CommunalHotCell
                image={rowData.image}
                title={rowData.title}
            />
        );
    }

    componentDidMount() {
        this.fetchData();
    }

    render() {
        return (
            <View style={styles.container}>
                {/* 導(dǎo)航欄樣式 */}
                <CommunalNavBar
                    titleItem = {() => this.renderTitleItem()}
                    rightItem = {() => this.renderRightItem()}
                />

                <ListView
                    dataSource={this.state.dataSource}
                    renderRow={this.renderRow}
                    showsHorizontalScrollIndicator={false}
                    style={styles.listViewStyle}
                />
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex:1,
        alignItems: 'center',
    },

    navbarTitleItemStyle: {
        fontSize:17,
        color:'black',
        marginLeft:50
    },
    navbarRightItemStyle: {
        fontSize:17,
        color:'rgba(123,178,114,1.0)',
        marginRight:15
    },

    listViewStyle: {
        width:width,
    }
});

近半小時(shí)熱門.gif
  • 從效果圖中可以看出,我們還少了上面的提示標(biāo)題搬葬,這邊很簡單荷腊,我們也來快速完成一些
    {/* 頂部提示 */}
    <View style={styles.headerPromptStyle}>
        <Text>根據(jù)每條折扣的點(diǎn)擊進(jìn)行統(tǒng)計(jì),每5分鐘更新一次</Text>
    </View>

樣式部分:

    headerPromptStyle: {
        height:44,
        width:width,
        backgroundColor:'rgba(239,239,239,0.5)',
        justifyContent:'center',
        alignItems:'center'
    }

提示標(biāo)題補(bǔ)充.png

隱藏于顯示TabBar之通知的使用


  • 配置TabBar隱藏與顯示條件

    // ES6
    // 構(gòu)造
      constructor(props) {
        super(props);
        // 初始狀態(tài)
        this.state = {
            selectedTab:'home',
            isHiddenTabBar:false,   // 是否隱藏tabbar
        };
      }
      
   <TabNavigator
                tabBarStyle={this.state.isHiddenTabBar !== true ? {} : {height:0, overflow:'hidden'}}
                sceneStyle={this.state.isHiddenTabBar !== true ? {} : {paddingBottom:0}}
            >
                {/* 首頁 */}
                {this.renderTabBarItem("首頁", 'home', 'tabbar_home_30x30', 'tabbar_home_selected_30x30', Home)}
                {/* 海淘 */}
                {this.renderTabBarItem("海淘", 'ht', 'tabbar_abroad_30x30', 'tabbar_abroad_selected_30x30', HT)}
                {/* 小時(shí)風(fēng)云榜 */}
                {this.renderTabBarItem("小時(shí)風(fēng)云榜", 'hourlist', 'tabbar_rank_30x30', 'tabbar_rank_selected_30x30', HourList)}
            </TabNavigator>

  • 這邊我們引入新的知識 —— 通知

  • 使用通知很簡單,首先需要注冊通知并在適當(dāng)?shù)牡胤竭M(jìn)行銷毀


    componentDidMount() {
        // 注冊通知
        this.subscription = DeviceEventEmitter.addListener('isHiddenTabBar', (data)=>{this.tongZhi(data)});
    }

    componentWillUnmount() {
        // 銷毀
        this.subscription.remove();
    }

  • 接著在我們需要的地方發(fā)送通知

    componentWillMount() {
        // 發(fā)送通知
        DeviceEventEmitter.emit('isHiddenTabBar', true);
    }

    componentWillUnmount() {
        // 發(fā)送通知
        DeviceEventEmitter.emit('isHiddenTabBar', false);
    }

隱藏顯示TabBar.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末急凰,一起剝皮案震驚了整個(gè)濱河市女仰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抡锈,老刑警劉巖董栽,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異企孩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)袁稽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門勿璃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人推汽,你說我怎么就攤上這事补疑。” “怎么了歹撒?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵莲组,是天一觀的道長。 經(jīng)常有香客問我暖夭,道長锹杈,這世上最難降的妖魔是什么撵孤? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮竭望,結(jié)果婚禮上邪码,老公的妹妹穿的比我還像新娘。我一直安慰自己咬清,他們只是感情好闭专,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旧烧,像睡著了一般影钉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掘剪,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天平委,我揣著相機(jī)與錄音,去河邊找鬼杖小。 笑死肆汹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的予权。 我是一名探鬼主播昂勉,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扫腺!你這毒婦竟也來了岗照?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤笆环,失蹤者是張志新(化名)和其女友劉穎攒至,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躁劣,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迫吐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了账忘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片志膀。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鳖擒,靈堂內(nèi)的尸體忽然破棺而出溉浙,到底是詐尸還是另有隱情,我是刑警寧澤蒋荚,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布戳稽,位于F島的核電站,受9級特大地震影響期升,放射性物質(zhì)發(fā)生泄漏惊奇。R本人自食惡果不足惜互躬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赊时。 院中可真熱鬧吨铸,春花似錦、人聲如沸祖秒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竭缝。三九已至房维,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抬纸,已是汗流浹背咙俩。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湿故,地道東北人阿趁。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像坛猪,于是被迫代替她去往敵國和親脖阵。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

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