ReactNative開(kāi)發(fā)過(guò)程中的那些磕磕絆絆

近幾個(gè)迭代版本我們大iOS都是采用react-native開(kāi)發(fā)的壤圃,因?yàn)榧夹g(shù)比較新,開(kāi)發(fā)過(guò)程中遇到各種各樣的問(wèn)題再是在所難免的囤热。忙里偷閑昙啄,趕緊把遇到的問(wèn)題及解決方案做個(gè)總結(jié)穆役,免得日后又忘了。

問(wèn)題一:

如圖:

報(bào)錯(cuò)信息.png

不知道大家有沒(méi)有遇到過(guò)類(lèi)似的問(wèn)題跟衅。上圖中的報(bào)錯(cuò)我是在3.14.0版本的開(kāi)發(fā)中第一次遇到,老實(shí)說(shuō)這個(gè)問(wèn)題困擾了我一天播歼,我嘗試了各種方法伶跷,并且利用 Chrome 聯(lián)機(jī)調(diào)試也沒(méi)發(fā)現(xiàn)問(wèn)題的所在掰读。
這個(gè)問(wèn)題發(fā)生了三次:

第一次,是在render里的ListView 組件中叭莫,只要我添加了ListView就回報(bào)錯(cuò)蹈集,但是將ListView替換成普通的View就沒(méi)有問(wèn)題了,這下好了鎖定目標(biāo)雇初,一定是ListView有問(wèn)題拢肆,哪里沒(méi)有配置好。

第二次靖诗,發(fā)生在渲染自定義Cell中郭怪,和第一次在一個(gè)類(lèi)中。

第三次刊橘,發(fā)生在條件判斷中鄙才。

不要著急,下面聽(tīng)我給你娓娓道來(lái)

情況一:

來(lái)粘段代碼看看:

render() {
        if (this.state.offline) {
            return (
                <GuideOfflineView />
            );
        }
        if (!this.state.data) {
            return (
                <LoadingView />
            );
        }
        return (
            <View style={{ flex: 1 }}>
                <View style={{
                    width: App.Constant.screenWidth,
                    marginTop: 30,
                    marginBottom:20,
                    flexDirection: 'row',
                    alignItems: 'flex-start',
                    justifyContent: 'space-between',
                }}>
                    <TouchableOpacity style={{
                        marginLeft: 20,
                    }}
                        onPress={this.onCloseBtnPress}>
                        <Image source={App.Image.btn.guideListClose} />
                    </TouchableOpacity>
                    <Text style={{
                        fontSize: 17,
                        color: App.Color.darkGray,
                        textAlign: 'center',
                    }}>
                        Title
                </Text>
                    <View style={{
                        marginRight: 20,
                        height: 13,
                        width: 13,
                    }} />
                </View>
                <TableView
                    data={this.state.data}
                    dataSource={this.state.dataSource}
                    requestData={this.loadMoreData}
                />
            </View>
        );
    }

這里是render()頁(yè)面促绵,里面的TableView是我自定義的ListView組件攒庵,為了使代碼更清晰,就把他提出來(lái)

const TableView = ({
    style,
    dataSource,
    data,
    requestData,
}) => {
    const loadMoreMessage = () => {
        if (data.items.length === data.total) {
            return;
        }
        requestData();
    };
    if (dataSource === undefined || dataSource.getRowCount() === 0) {
        return (
            <View style={{
                flex: 1,
                alignItems: 'center',
                justifyContent: 'center',
            }}>
                <Text style={{
                    alignItems: 'center',
                    justifyContent: 'center',
                    fontSize: 14,
                    color: App.Color.darkGray,
                }}>
                    暫無(wú)云導(dǎo)游
                </Text>
            </View>
        );
    } else {
        return <ListView
            opacity={1}
            dataSource={dataSource}
            renderRow={GuideListCell}
            showVerticalScrollIndicator={false}
            enableEmptySections={true}
            onEndReached={() => { loadMoreMessage(); } }
            onEndReachedThreshold={20}
            renderSeparator={(sectionID, rowID) => {
                return (
                    <View
                        key={`${sectionID}-${rowID}`}
                        style={{
                            height: 0,
                            width: App.Constant.screenWidth,
                            marginTop: 20,
                        }} />
                );
            } }
            />;
    }
};

在ListView中配置了 datasource 和自定義 cell败晴,經(jīng)驗(yàn)告訴我這里L(fēng)istView出問(wèn)題不是datasource有問(wèn)題就是自定義cell又問(wèn)題浓冒。

第一步:檢查dataSource

updateDataSource(data) {
        if (data !== undefined) {
            let newData;
            if (this.state.data !== undefined) {
                newData = this.state.data;
                newData.items = this.state.data.items.concat(data.items);
            } else {
                newData = data;
            }
            var ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
            this.setState({
                data: newData,
                dataSource: ds.cloneWithRows(newData.items),
            });
        }
    }

在我請(qǐng)求完數(shù)據(jù)后對(duì) ListView 的 datasource 也按要求進(jìn)行了配置锨能。

這里我想稍微提一下:ListView 對(duì)它的 datasource 是有嚴(yán)格格式要求的算途,首先 datasource 必須是數(shù)組,這樣它才能根據(jù)不同的 rowID 來(lái)取出對(duì)應(yīng)數(shù)據(jù)進(jìn)行渲染必峰。其次糖驴,想要 ListView 使用 datasource 必須要經(jīng)過(guò) ds.cloneWithRow(dataSource) 操作僚祷,這步操作主要是為了提取新數(shù)據(jù)并進(jìn)行逐行進(jìn)行比較,這樣ListView就知道哪些行需要重新渲染贮缕。

來(lái)打印一下數(shù)據(jù)看ListView的dataSource對(duì)不對(duì)

'--->> dataSource', { _rowHasChanged: [Function: rowHasChanged],
  _getRowData: [Function: defaultGetRowData],
  _sectionHeaderHasChanged: [Function],
  _getSectionHeaderData: [Function: defaultGetSectionHeaderData],
  _dataBlob: 
   { s1: 
      [ 
        { _id: '36398d0d3c3a43cb86473f411eb4094a',
          name: '臺(tái)東區(qū)',
          weight: 12,
          items: 
           [ { _id: '706b5c36479742308603788a74b6781c',
               location: { lat: 0, lng: 0 },
               cover: { source: 'https://image-cdn.fishsaying.com/89be2d8757cf47dbb1152abb08d765b6.jpg' },
               scenic_id: '36398d0d3c3a43cb86473f411eb4094a',
               title: '東京臺(tái)東區(qū) 大和風(fēng)骨',
               weight: 12 } ] },
      
        { _id: '9de32b5fffd7451883ff16e0905bb8e3',
          name: '澀谷',
          weight: 14,
          items: 
           [ { _id: 'd643b686ad54426dbd22120861636dd2',
               location: { lat: 0, lng: 0 },
               cover: { source: 'https://image-cdn.fishsaying.com/a9f971ef9d7647a8aa7586431e7db972.jpg' },
               scenic_id: '9de32b5fffd7451883ff16e0905bb8e3',
               title: '東京澀谷區(qū) 時(shí)尚前沿',
               weight: 14 } ] },
        { _id: '1c6eeeaa96f647e9b3afc9456ccb4e6e',
          name: '新宿',
          weight: 15,
          items: 
           [ { _id: '0ae445cf20424c08ac12e03c500a7a46',
               location: { lat: 0, lng: 0 },
               cover: { source: 'https://image-cdn.fishsaying.com/d872e0876ae44481a391c17bbac76515.jpg' },
               scenic_id: '1c6eeeaa96f647e9b3afc9456ccb4e6e',
               title: '東京新宿區(qū) 都市傳說(shuō)',
               weight: 15 } ] },
        { _id: '54cdcbb39a0b8ad439d0605c',
          name: '塔爾寺景區(qū)',
          weight: 21,
          items: 
           [ { _id: '109e76e39d6b428a9e5c93cdc11f3367',
               location: { lat: 0, lng: 0 },
               cover: { source: 'https://image-cdn.fishsaying.com/485283515ff346119903fc0d000050eb.jpg' },
               scenic_id: '54cdcbb39a0b8ad439d0605c',
               title: '塔爾寺云導(dǎo)游',
               weight: 21 } ] } ] },
  _dirtyRows: 
   [ [ true,
       true,
       true,
       true ] ],
  _dirtySections: [ true ],
  _cachedRowCount: 4,
  rowIdentities: [ [ '0', '1', '2', '3' ] ],
  sectionIdentities: [ 's1' ] }

一切正常辙谜,格式標(biāo)準(zhǔn),說(shuō)明打dataSource是沒(méi)有問(wèn)題的感昼。

排除dataSource出錯(cuò)装哆。

第二步:檢查renderRow中配置的Cell

這里我所傳進(jìn)去的是自定義的Cell --> GuideListCell

import React from 'react'; // eslint-disable-line no-unused-vars
import {
    View,
    StyleSheet,
} from 'react-native';

import App from '.././helper/app.js';
import CloudGuideContainer from './CloudGuideContainer.js';

const Constants = {
  height: App.Constant.screenWidth * 0.58,
  width: App.Constant.screenWidth - 40,
};

const GuideListCell = (rowData, sectionID, rowID) => {
   const name = rowData.name;
   return (
     <View style = {styles.container}>
        <Text style = {styles.title}>
        {name}
        </Text>
      <View style = {styles.listContainer}>
        <CloudGuideContainer dataSource = {rowData} />
      </View>
     </View>
);
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'flex-start',
    alignItems: 'center',
    width:Constants.width,
    height:Constants.height,
    marginLeft:20,
  },
  listContainer: {
    marginTop:20,
    width:Constants.width,
    height:Constants.height,
  },
  title: {
    width:Constants.width,
    fontSize: 14,
    color: App.Color.darkGray,
  }
});

export default GuideListCell;

看起來(lái)也沒(méi)有啥問(wèn)題呀,reload 一下還是報(bào)同樣的錯(cuò)誤定嗓,Chrome調(diào)試斷點(diǎn)又不能在return的組件里面打蜕琴,最后會(huì)crash在react里面的js文件中這還怎么玩?

Chrome調(diào)試報(bào)錯(cuò)信息.png

無(wú)奈之下我用一個(gè)最笨的辦法來(lái)找報(bào)錯(cuò)原因宵溅,把return方法中的所有代碼都注釋掉凌简,只留一個(gè)<View />給這個(gè)View一個(gè)背景色,果然這樣ListView出來(lái)了恃逻,不報(bào)錯(cuò)了找這樣的方法雏搂,一個(gè)控件一個(gè)控件的打開(kāi)藕施。幾分鐘的時(shí)間就找到問(wèn)題了 —— Text,你就是罪魁禍?zhǔn)淄怪!裳食?蔀槭裁茨兀谑俏覐牡谝恍虚_(kāi)始重新瀏覽代碼芙沥,結(jié)果讓我恨毒了自己

import {
    View,
    StyleSheet,
} from 'react-native';

這里面忘了import Text 了

So诲祸,不要對(duì)Rect的報(bào)錯(cuò)機(jī)制有太大幻想,的確有時(shí)他會(huì)報(bào)錯(cuò)說(shuō)沒(méi)有找個(gè)這個(gè)組件或者變量而昨,但有的時(shí)候人家就會(huì)給你報(bào)些摸不著頭腦的錯(cuò)誤信息救氯。

自定義Cell出了問(wèn)題,這個(gè)猜測(cè)是對(duì)的配紫。

情況二:

還是自定義GuideListCell中径密。正在我為了找到問(wèn)題原因并順利解決洋洋得意的時(shí)候,再次請(qǐng)求時(shí)躺孝,同樣的錯(cuò)誤又發(fā)生了享扔,不同的只是這次報(bào)錯(cuò)的ID和上次不一樣,但錯(cuò)誤格式還是一毛一樣植袍。但剛才分明是好了的惧眠,界面完完整整的展現(xiàn)在我面前呀。于是我堅(jiān)信這次不該是我的問(wèn)題于个,一定是數(shù)據(jù)問(wèn)題氛魁,再次打印請(qǐng)求結(jié)果發(fā)現(xiàn),后臺(tái)修改了返回?cái)?shù)據(jù)厅篓,刪除了name字段秀存,但是我依然還在取rowData.name 字段,這時(shí)羽氮,name字段已經(jīng)不存在了或链,當(dāng)然會(huì)報(bào)錯(cuò)。這個(gè)鍋后臺(tái)Java大叔義不容辭的給背了档押。

情況三:

粘段代碼先澳盐,

return (
            <View>         
                {this.state.showEmptyView ?
                    <EmptyView/>
                    :
                    <View style={styles.listViewContainer}>
                   this.state.dataSource &&
                    <ListView
                    opacity={1}
                    dataSource={this.state.dataSource}
                    renderRow={ExplicitGuideCell.bind(null,this.updateDownloadStatus)}
                    showVerticalScrollIndicator={false}
                    enableEmptySections={true}
                    onEndReached={this.loadMoreData}
                    onEndReachedThreshold={20}
                    renderSeparator={(sectionID, rowID) => {
                        return (
                            <View
                                key={`${sectionID}-${rowID}`}
                                style={{
                                    height: 0,
                                    width: App.Constant.screenWidth,
                                    marginTop: 10,
                                }} />
                        );
                    } }
                    />
                </View>
                }
                </View>
                </Image>
            </View>
        );

這段代碼邏輯很簡(jiǎn)單,就是如果請(qǐng)求回來(lái)的數(shù)據(jù)為空時(shí)令宿,顯示空頁(yè)面叼耙,否則,判斷this.state.datasource 是否存在粒没,存在就顯示ListView筛婉。
reload 一下,又是那個(gè)熟悉的紅色界面癞松,背心一陣寒意爽撒,這么簡(jiǎn)單的界面怎么又錯(cuò)了冕碟,積累了前兩次的經(jīng)驗(yàn),我把import中的組件都檢查了一遍匆浙,用到的都導(dǎo)入了,數(shù)據(jù)請(qǐng)求成功后也給this.state 設(shè)置了數(shù)據(jù)厕妖,為什么還報(bào)錯(cuò)呢首尼?
的確,這里有兩層條件判斷言秸,一個(gè)疏忽就會(huì)出問(wèn)題软能,所以我還是不建議在return 組件中進(jìn)行太復(fù)雜的邏輯判斷。錯(cuò)誤原因竟是一對(duì)花括號(hào)

二層邏輯判斷 this.state.dataSource && 前后忘記了花括號(hào)举畸。

綜上所述查排,不難看出以上三種情況都報(bào)了同樣的錯(cuò)誤,不同的只是ID抄沮。雖然錯(cuò)誤信息讓你迷茫跋核,但這三種情況都出現(xiàn)在渲染界面的時(shí)候,所以均與return()方法相關(guān)叛买。

以后若是在遇到這種錯(cuò)誤砂代,不妨多在渲染界面的方法中找找原因吧!

問(wèn)題二:

有這樣一個(gè)界面

列表.png

一個(gè)列表中的cell里面又是一個(gè)列表率挣,并且里層的列表可以向左滑動(dòng)瀏覽刻伊。
我的想法就是,外面一個(gè)ListView椒功,在這個(gè)ListView的Cell里面又是一個(gè)橫向滑動(dòng)的ListView捶箱。找到思路了那就開(kāi)工吧!

結(jié)果是在 react-native 中不能直接嵌套使用 ListView动漾,也就是說(shuō)丁屎,不可以在首層的ListView的Cell 中直接再嵌套一個(gè) ListView,就像這樣

const GuideListCell = (rowData, sectionID, rowID) => {
   const name = rowData.name;
   return (
     <View style = {styles.container}>
        <Text style = {styles.title}>
        {name}
        </Text>
      <View style = {styles.listContainer}>
      <ListVeew 
       dataSource = {rowData}
       renderRow = {CustomerCell} 
       />
      </View>
     </View>
);
};

親身試驗(yàn)這樣是不行的,具體報(bào)錯(cuò)信息搞忘了

解決方案

不能直接嵌套谦炬,那我就間接嵌套唄悦屏!先用一個(gè)View把二層的ListView封裝進(jìn)去,然后在一層的ListView Cell中調(diào)用這個(gè)空間就行啦键思!

const GuideListCell = (rowData, sectionID, rowID) => {
   const name = rowData.name;
   return (
     <View style = {styles.container}>
        <Text style = {styles.title}>
        {name}
        </Text>
      <View style = {styles.listContainer}>
        <CloudGuideContainer dataSource = {rowData} />
      </View>
     </View>
);
};

其中CloudGuideContainer 就是那個(gè)包裹础爬,用來(lái)包裹二層ListView

來(lái)看看這個(gè)包裹的真面目吧!

import React from 'react'; // eslint-disable-line no-unused-vars
import {
  View,
  ListView,
} from 'react-native';

import App from '.././helper/app.js';
import CloudGuideCell from './CloudGuideCell.js';

const Constants = {
  height: App.Constant.screenWidth * 0.4776,
};

const CloudGuideContainer = ({dataSource}) => {
    const ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
    const guideDataSource = ds.cloneWithRows(dataSource.items);
    return (
        <ListView
            style = {{overflow: 'visible',}}
            enableEmptySections={true}
            showsHorizontalScrollIndicator={false}
            horizontal={true}
            dataSource={guideDataSource}
            renderRow={CloudGuideCell}
            renderSeparator={(sectionID, rowID) => {
                return (
                    dataSource.items.length > 1 ?
                    <View
                    key={`${sectionID}-${rowID}`}
                    style={{
                        width: 10,
                         height: Constants.height,
                    }} /> : null
                );
                } }
            />
        );
};

export default CloudGuideContainer;

機(jī)智如我吼鳞,哈哈

問(wèn)題三:

關(guān)于this.state,不太了解的建議直接看官方文檔

我遇到到問(wèn)題是這樣的看蚜,有一個(gè)列表數(shù)據(jù)很多,需要分頁(yè)請(qǐng)求赔桌,因此我在this.state 中聲明一個(gè)變量 page 初始值為 0 供炎,每次請(qǐng)求的時(shí)候給state的page加一渴逻,直到this.state.data.length === this
.state.data.total 的時(shí)候停止請(qǐng)求直接return,這個(gè)做法看上去是沒(méi)有的問(wèn)題的音诫,但是在特殊情況下就回發(fā)生錯(cuò)誤惨奕,比如下圖是一個(gè)搜索功能,當(dāng)輸入關(guān)鍵字后點(diǎn)擊搜索將會(huì)請(qǐng)求數(shù)據(jù)竭钝。但是會(huì)有這種情況梨撞,當(dāng)我輸完關(guān)鍵字后搜索了幾頁(yè)數(shù)據(jù)后,我點(diǎn)擊TextInput香罐,但是沒(méi)有修改關(guān)鍵字卧波,再次點(diǎn)擊搜索這時(shí)我的page應(yīng)該從1開(kāi)始才對(duì),可實(shí)驗(yàn)證明庇茫,page會(huì)從上一次的計(jì)數(shù)值往上加1港粱,而不是從1開(kāi)始。

搜索.jpg

下面粘上部分相關(guān)代碼

export default class SearchDetail extends React.Component {
    constructor(props){
        super(props);
        this.state = {
            title: props.title,
            keyword: props.keyword,
            contentStr:props.keyword,
            cellType:undefined,
            data: undefined,
            dataSource: undefined,
            showEmptyView:false,
            fetchingData:false,
            page:0,
        };
   }
   
   // 請(qǐng)求數(shù)據(jù)
     async fetchData (keyword) {
      var urlStr;
      var cell;
      const nextIndex = this.state.page + 1;
      this.setState({
        cellType: cell,
        fetchingData:true,
      });
      try {
            const result = await App.Request.get({
                url: urlStr,
                parameters: {
                    page: nextIndex,
                    limit: App.Constant.limit,
                    keyword:keyword,
                }
            });
            this.updateDataSource(result);
        } catch (error) {
            this.setState({
                data: [],
                offline: true,
                fetchingVoices: false,
            });
        }
    }
    
    // 點(diǎn)擊搜索
     submitKeyWords(text) {
        this.setState({
            showEmptyView:false,
            dataSource:undefined,
            data:undefined,,
            page:0
        });
        this.fetchData(text);
    }

我先搜索武侯祠相關(guān)數(shù)據(jù)旦签,請(qǐng)求三頁(yè)

2017-01-12 14:31:21.210 [info][tid:com.facebook.react.JavaScript] '--->> page', 1
2017-01-12 14:31:21.210172 [5377:3542880] '--->> page', 1
2017-01-12 14:31:25.409 [info][tid:com.facebook.react.JavaScript] '--->> page', 2
2017-01-12 14:31:25.409329 [5377:3542880] '--->> page', 2
2017-01-12 14:31:27.649 [info][tid:com.facebook.react.JavaScript] '--->> page', 3
2017-01-12 14:31:27.652452 [5377:3542880] '--->> page', 3

接著我不修改任何關(guān)鍵字查坪,再次點(diǎn)擊搜索

[tid:com.facebook.react.JavaScript] '--->> page', 4
2017-01-12 14:31:57.153670 [5377:3542880] '--->> page', 4

page并沒(méi)有如我所愿的從1開(kāi)始。也就是說(shuō)我在submitKeyWords(text)方法中宁炫,在fetchData之前給將state中的page設(shè)為0咪惠,并沒(méi)有起作用。說(shuō)不起作用可能有些不妥淋淀,只能說(shuō)在我用state的page的時(shí)候它至少還不為0遥昧。因此我推斷this.setState方法可能是異步的。于是我google了一下果不其然

State Updates May Be Asynchronous
React may batch multiple setState() calls into a single update for performance.

Because this.props and this.state may be updated asynchronously, you should not rely on their values for calculating the next state.

文檔地址https://facebook.github.io/react/docs/state-and-lifecycle.html

好了朵纷,找到問(wèn)題的原因了炭臭,那怎么解決呢?如果在OC中我一定會(huì)聲明一個(gè)屬性來(lái)做這件事袍辞,那不妨也在react中試一試鞋仍,看是否可行。改一下代碼:

export default class SearchDetail extends React.Component {
    constructor(props){
        super(props);
        this.page = 0;
        this.state = {
            title: props.title,
            keyword: props.keyword,
            contentStr:props.keyword,
            cellType:undefined,
            data: undefined,
            dataSource: undefined,
            showEmptyView:false,
            fetchingData:false,
        };
    }
    
  async fetchData (keyword) {
      var urlStr;
      var cell;
      const nextIndex = this.page + 1;
      this.setState({
        cellType: cell,
        fetchingData:true,
      });
      this.page = nextIndex;
      try {
            const result = await App.Request.get({
                url: urlStr,
                parameters: {
                    page: nextIndex,
                    limit: App.Constant.limit,
                    keyword:keyword,
                }
            });
            this.updateDataSource(result);
        } catch (error) {
            this.setState({
                data: [],
                offline: true,
                fetchingVoices: false,
            });
        }
    }
    
  submitKeyWords(text) {
        this.setState({
            showEmptyView:false,
            dataSource:undefined,
            data:undefined,
        });
        this.page = 0;
        this.fetchData(text);
    }

reload 一下搅吁,成功威创!每當(dāng)我點(diǎn)擊搜索按鈕page都會(huì)先被置為0。

問(wèn)題四:

你是怎么設(shè)施Text組件的背景色透明呢谎懦?

一開(kāi)始我用了一種很笨的方法 backgroundColor: App.Color.white.alpha(0) 簡(jiǎn)直要被自己蠢哭了

有次無(wú)意中看到別人的方法
backgroundColor: 'transparent'
學(xué)習(xí)了!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肚豺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子界拦,更是在濱河造成了極大的恐慌吸申,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異截碴,居然都是意外死亡梳侨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)日丹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)走哺,“玉大人,你說(shuō)我怎么就攤上這事哲虾「钭梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵妒牙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我对妄,道長(zhǎng)湘今,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任剪菱,我火速辦了婚禮摩瞎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孝常。我一直安慰自己旗们,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布构灸。 她就那樣靜靜地躺著上渴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喜颁。 梳的紋絲不亂的頭發(fā)上稠氮,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音半开,去河邊找鬼隔披。 笑死,一個(gè)胖子當(dāng)著我的面吹牛寂拆,可吹牛的內(nèi)容都是我干的奢米。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纠永,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鬓长!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起尝江,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痢士,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體怠蹂,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡善延,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了城侧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片易遣。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嫌佑,靈堂內(nèi)的尸體忽然破棺而出豆茫,到底是詐尸還是另有隱情,我是刑警寧澤屋摇,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布揩魂,位于F島的核電站,受9級(jí)特大地震影響炮温,放射性物質(zhì)發(fā)生泄漏火脉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一柒啤、第九天 我趴在偏房一處隱蔽的房頂上張望倦挂。 院中可真熱鬧,春花似錦担巩、人聲如沸方援。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)犯戏。三九已至,卻和暖如春拳话,著一層夾襖步出監(jiān)牢的瞬間笛丙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工假颇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胚鸯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓笨鸡,卻偏偏與公主長(zhǎng)得像姜钳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子形耗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 公司打算用react-native開(kāi)發(fā)APP哥桥,初始RN遇到了很多坑,搭建了一個(gè)小的項(xiàng)目框架激涤,結(jié)合redux根據(jù)公司...
    45b645c5912e閱讀 723評(píng)論 0 5
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評(píng)論 25 707
  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內(nèi)容...
    i得深刻方得S閱讀 4,631評(píng)論 1 9
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理拟糕,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 越是不守規(guī)則的人送滞,越喜歡中國(guó)這個(gè)法制社會(huì)侠草。因?yàn)橹袊?guó)的法制,其實(shí)是向弱者傾斜的弱者有理制度犁嗅。 在這個(gè)體制下边涕,不懂法沒(méi)...
    maofay閱讀 347評(píng)論 1 8