ReactJS學(xué)習(xí)筆記——生命周期度帮、數(shù)據(jù)流與事件

作者:小米墨客
原文地址:http://my.oschina.net/feiyangxiaomi/blog/644418

React是一個(gè)JavaScript庫(kù)文件,使用它的目的在于能夠解決構(gòu)建大的應(yīng)用和數(shù)據(jù)的實(shí)時(shí)變更稿存。該設(shè)計(jì)使用JSX允許你在構(gòu)建標(biāo)簽結(jié)構(gòu)時(shí)充分利用JavaScript的強(qiáng)大能力笨篷,而不必在笨拙的模板語(yǔ)言上浪費(fèi)時(shí)間。

1 生命周期

在組件的整個(gè)生命周期中瓣履,隨著該組件的props或者state發(fā)生改變率翅,它的DOM表現(xiàn)也將有相應(yīng)的變化,一個(gè)組件就是一個(gè)狀態(tài)機(jī):對(duì)于特定的輸入袖迎,它總會(huì)返回一致的輸出冕臭。 React為每個(gè)組件提供了生命周期鉤子函數(shù)去響應(yīng)不同的時(shí)刻腺晾,組件的生命周期分為三個(gè)部分:(1)實(shí)例化;(2)存在期辜贵;(3)銷毀&清理期丘喻。

具體周期如下圖所示:

1.1 實(shí)例化

創(chuàng)建在代碼加載過(guò)程中至關(guān)重要,重要之處體現(xiàn)什么地方呢念颈,這里粗略的簡(jiǎn)述幾點(diǎn):

  1. 實(shí)例化是首次加載js展示給用戶最直觀的內(nèi)容泉粉,效率的高低直接決定體驗(yàn)的好壞;
  2. 實(shí)例化過(guò)程是對(duì)數(shù)據(jù)進(jìn)行說(shuō)明和描述的過(guò)程榴芳。
  3. 實(shí)例化過(guò)程完成了虛擬DOM和真實(shí)DOM的生成嗡靡。

下面看下示例來(lái)展示當(dāng)前流程:

var React = require("react");
var ReactDOM = require("react-dom");

var List = React.createClass({
    //1.創(chuàng)建階段
    getDefaultProps:function() {
        console.log("getDefaultProps");
        return {};
    },

    //2.實(shí)例化階段
    getInitialState:function() {
        console.log("getInitialState");
        return {};
    },

    //render之前調(diào)用,業(yè)務(wù)邏輯都應(yīng)該放在這里窟感,如對(duì)state的操作等
    componentWillMount:function() {
        console.log("componentWillMount");
    },

    //渲染并返回一個(gè)虛擬DOM
    render:function() {
        console.log("render");
        return(
            <div> hello <strong> {this.props.name} </strong></div>
            );
    },

    //該方法發(fā)生在render方法之后讨彼。在該方法中,ReactJS會(huì)使用render生成返回的虛擬DOM對(duì)象來(lái)創(chuàng)建真實(shí)的DOM結(jié)構(gòu)
    componentDidMount:function() {
        console.log("componentDidMount");
    },
});


ReactDOM.render(<List name="ReactJS">children</List>, document.body);

輸出結(jié)果為:

getDefaultProps
getInitialState
componentWillMount
render
componentDidMount

上面經(jīng)歷的實(shí)例化過(guò)程可細(xì)分成兩個(gè)階段:創(chuàng)建階段和實(shí)例化階段柿祈。

1.1.1創(chuàng)建階段

該階段主要發(fā)生在創(chuàng)建組件類的時(shí)候哈误,即調(diào)用React.createClass的時(shí)候。這個(gè)階段只會(huì)觸發(fā)一個(gè)getDefaultProps方法躏嚎,該方法返回一個(gè)對(duì)象蜜自,并且緩存下來(lái)。然后與父組件指定的props對(duì)象合并卢佣,最后賦值給this.props作為該組件的默認(rèn)屬性重荠。對(duì)于那些沒(méi)有被父輩組件指定的props屬性的新建實(shí)例來(lái)說(shuō),這個(gè)方法返回的對(duì)象可用于為實(shí)例設(shè)置默認(rèn)的props值虚茶。

props屬性又是什么呢戈鲁,它是一個(gè)對(duì)象,是組件用來(lái)接收外面?zhèn)鱽?lái)的參數(shù)的嘹叫,組件內(nèi)部是不允許修改自己的props屬性的婆殿,只能通過(guò)父組件來(lái)修改。在getDefaultProps方法中罩扇,是可以設(shè)定props默認(rèn)值的婆芦。

1.1.2實(shí)例化階段

該階段主要發(fā)生在實(shí)例化組件類的時(shí)候,也就是該組件類被調(diào)用的時(shí)候:

ReactDOM.render(<NewView name="ReactJS">children</NewView>, document.body);

調(diào)用順序在demo結(jié)果中頁(yè):

  • getInitialState 初始化組件的state的值暮蹂,其返回值會(huì)賦值給組件的this.state屬性寞缝。對(duì)于組件的每個(gè)實(shí)例來(lái)說(shuō),這個(gè)方法的調(diào)用次數(shù)有且只有一次仰泻。與getDefaultProps方法不同的是,每次實(shí)例創(chuàng)建時(shí)該方法都會(huì)被調(diào)用一次滩届。
  • componentWillMount 此方法會(huì)在完成首次渲染之前被調(diào)用集侯。這也是在render方法調(diào)用前可以修改組件state的最后一次機(jī)會(huì)被啼。
  • render 生成頁(yè)面需要的虛擬DOM結(jié)構(gòu),用來(lái)表示組件的輸出棠枉。render方法需要滿足:
    (1)只能通過(guò)this.propsthis.state訪問(wèn)數(shù)據(jù)浓体;
    (2)可以返回nullfalse或者任何React組件辈讶;
    (3)只能出現(xiàn)一個(gè)頂級(jí)組件命浴;
    (4)必需純凈,意味著不能改變組件的狀態(tài)或者修改DOM的輸出贱除。
  • componentDidMount 該方法發(fā)生在render方法成功調(diào)用并且真實(shí)的DOM已經(jīng)被渲染之后生闲,在該函數(shù)內(nèi)部可以通過(guò)this.getDOMNode()來(lái)獲取當(dāng)前組件的節(jié)點(diǎn)。然后就可以像Web開(kāi)發(fā)中的那樣操作里面的DOM元素了月幌。

上面提到了兩個(gè)比較生分的術(shù)語(yǔ)——state和虛擬DOM:

  • state:是組建的屬性碍讯,主要用來(lái)存儲(chǔ)組件自身需要的數(shù)據(jù)。它是可以改變的扯躺,它的每次改變都會(huì)引起組件的更新捉兴,這也是ReactJS中的關(guān)鍵點(diǎn)之一。每次數(shù)據(jù)的更新都是通過(guò)修改state屬性的值录语,然后ReactJS內(nèi)部會(huì)監(jiān)聽(tīng)state屬性的變化倍啥,一旦發(fā)生變化,就會(huì)主動(dòng)出發(fā)組件的render方法來(lái)更新DOM結(jié)構(gòu)澎埠。
  • 虛擬DOM:它是ReactJS中提出的一個(gè)概念逗栽,是將真實(shí)的DOM結(jié)構(gòu)映射成一個(gè)JSON數(shù)據(jù)結(jié)構(gòu),在有數(shù)據(jù)更改的時(shí)候更新真實(shí)的DOM失暂,不需修改的時(shí)候不更新真實(shí)的DOM彼宠。

1.2 存在期

由1.1可知,此時(shí)組件已經(jīng)渲染好并且用戶可以與它進(jìn)行交互弟塞,通常是通過(guò)一次鼠標(biāo)點(diǎn)擊凭峡、手指點(diǎn)按或者鍵盤(pán)事件來(lái)觸發(fā)一個(gè)事件處理器。隨著用戶改變了組件或者整個(gè)應(yīng)用的state决记,便會(huì)有新的state流入組件結(jié)構(gòu)樹(shù)摧冀。代碼如下所示:

var React = require("react");
var ReactDOM = require("react-dom");

var NewView = React.createClass({
    //1.創(chuàng)建階段
    getDefaultProps:function() {
        console.log("getDefaultProps");
        return {};
    },

    //2.實(shí)例化階段
    getInitialState:function() {
        console.log("getInitialState");
        return {
            num:1
        };
    },

    //render之前調(diào)用,業(yè)務(wù)邏輯都應(yīng)該放在這里系宫,如對(duì)state的操作等
    componentWillMount:function() {
        console.log("componentWillMount");
    },

    //渲染并返回一個(gè)虛擬DOM
    render:function() {
        console.log("render");
        return(
            <div> hello <strong> {this.props.name} </strong>
                <button onClick={this.handleAddNumber}> hello <strong> {this.state.num} </strong></button>
            </div>
            );
    },

    //該方法發(fā)生在render方法之后索昂。在該方法中,ReactJS會(huì)使用render生成返回的虛擬DOM對(duì)象來(lái)創(chuàng)建真實(shí)的DOM結(jié)構(gòu)
    componentDidMount:function() {
        console.log("componentDidMount");
    },

    //3.更新階段
    componentWillReceiveProps:function() {
        console.log("componentWillReceiveProps");
    },

    //是否需要更新
    shouldComponentUpdate:function() {
        console.log("shouldComponentUpdate");
        return true;
    },

    //將要更新
    componentWillUpdate:function() {
        console.log("componentWillUpdate");
    },

    //更新完畢
    componentDidUpdate:function() {
        console.log("componentDidUpdate");
    },

    //4.銷毀階段
    componentWillUnmount:function() {
        console.log("componentWillUnmount");
    },

    // 處理點(diǎn)擊事件
    handleAddNumber:function() {
        console.log("add num");
        this.setState({num:this.state.num+1});
        this.setProps({name:"newName"});
    }
});
ReactDOM.render(<NewView name="ReactJS"></NewView>, document.body);

該段代碼的目的是扩借,經(jīng)歷第一階段實(shí)例化階段椒惨,然后提供button按鈕,改變state狀態(tài)潮罪,也是調(diào)用代碼中的handleAddNumber:function()方法康谆,實(shí)現(xiàn)第二階段存在期的更新领斥,該階段在state狀態(tài)f發(fā)生改變,組件逐漸受到影響沃暗。

輸出結(jié)果為(不包含):

add num
componentWillReceiveProps
shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate
  • componentWillReceiveProps 在任意時(shí)刻月洛,組件的props都可以通過(guò)父輩組件來(lái)更改。當(dāng)組件接收到新的props(這里不同于state)時(shí)孽锥,會(huì)觸發(fā)該函數(shù)嚼黔,我們同時(shí)也獲得更改props對(duì)象及更新state的機(jī)會(huì)。
  • shouldComponentUpdate 該方法用來(lái)攔截新的props和state惜辑,然后開(kāi)發(fā)者可以根據(jù)自己設(shè)定邏輯唬涧,做出要不要更新render的決定,讓它更快韵丑。
  • componentWillUpdatecomponentWillMount方法類似爵卒,組件上會(huì)接收到新的props或者state渲染之前,調(diào)用該方法撵彻。但是不可以在該方法中更新state和props钓株。
  • render 生成頁(yè)面需要的虛擬DOM結(jié)構(gòu),并返回該結(jié)構(gòu)陌僵。
  • componentDidUpdatecomponentDidMount類似轴合,更新已經(jīng)渲染好的DOM。

1.3 生命周期之銷毀&清理

每當(dāng)react使用完一個(gè)組件碗短,這個(gè)組件就必須從DOM中卸載隨后被銷毀受葛。此時(shí),僅有的一個(gè)鉤子函數(shù)會(huì)做出響應(yīng)偎谁,完成所有的清理與銷毀工作总滩,這很必要。

componentWillUnmount

最后巡雨,隨著一個(gè)組件從它的層級(jí)結(jié)構(gòu)中移除闰渔,這個(gè)組件的生命也就走到了盡頭。該方法會(huì)在組件被移出之前調(diào)被調(diào)用铐望。在componentDidMount方法中添加的所有任務(wù)都需要在該方法中撤銷冈涧,比如說(shuō)創(chuàng)建的定時(shí)器或者添加的事件監(jiān)聽(tīng)等。

1.4 反模式:把計(jì)算后的值賦給state

getInitialState方法中正蛙,嘗試通過(guò)this.props來(lái)創(chuàng)建state的做法是一種反模式督弓。

getDefaultProps:function() {
        console.log("getDefaultProps");
        return {
            date:new Date()
        };
    },

    getInitialState:function() {
        console.log("getInitialState");
        return {
            num:this.props.date.getDay()
        };
    },

getInitialState中使用props的值,同時(shí)可能存在props的值沒(méi)有初始化完的狀態(tài)乒验。導(dǎo)致計(jì)算后的值永遠(yuǎn)不會(huì)與派生出他的props值同步愚隧。

getDefaultProps:function() {
        console.log("getDefaultProps");
        return {
            date:new Date()
        };
    },

    //渲染并返回一個(gè)虛擬DOM
    render:function() {
        console.log("render");
        var day = this.props.date.getMonth;
        return(
            <div> hello <strong> Day:{day}</strong>
            </div>
            );
    }

2 數(shù)據(jù)流與事件操作

在React中,數(shù)據(jù)流向是單向的——從父節(jié)點(diǎn)傳遞到子節(jié)點(diǎn)徊件,因而組件是簡(jiǎn)單且易于把握的奸攻,他們只需從父節(jié)點(diǎn)獲取props渲染即可蒜危。如果頂層組件的某個(gè)prop改變了虱痕,React會(huì)遞歸地向下遍歷整棵組建樹(shù)睹耐,重新渲染所有使用這個(gè)屬性的組件。 React組件內(nèi)部還具有自己的狀態(tài)部翘,這些狀態(tài)只能在組件內(nèi)修改硝训。React組件本身很簡(jiǎn)單,你可以把他們看成是一個(gè)函數(shù)新思,他接受props和state作為參數(shù)窖梁,返回一個(gè)虛擬的DOM表現(xiàn)。

2.1 Props

props是properties的縮寫(xiě)夹囚,你可以使用它把任意類型的數(shù)據(jù)傳遞給組件纵刘。我們先創(chuàng)建一個(gè)父組件Parent,它內(nèi)部調(diào)用的是一個(gè)叫child的子組件荸哟,并將接收到的外部參數(shù)name傳遞給子組件child假哎,代碼如下所示:

var React = require("react");
var ReactDOM = require("react-dom");

var Child = React.createClass({
    getDefaultProps:function() {
        return {};
    },

    getInitialState:function() {
        return {};
    },

    //渲染并返回一個(gè)虛擬DOM
    render:function() {
        return(
            <button> hello {this.props.name}</button>
            );
    }
});

var Parent = React.createClass({
    render:function() {
        return(
            <div onClick={this.onClick}>
                <Child name={this.props.name} id="child"> </Child>
            </div>
            );
    },

    onClick:function() {
        console.log(ReactDOM.findDOMNode(document.body));
    }
});

ReactDOM.render(<Parent  name="123"></Parent>, document.body);

我們?cè)?code>Parent上設(shè)置name="123",這個(gè)name經(jīng)由Parent傳遞給Childprops中鞍历,非常的方便舵抹。父組件可以傳遞任何值給到子組件。

2.2 PropTypes

通過(guò)在組件中定義一個(gè)配置對(duì)象劣砍,React提供了一種驗(yàn)證props的方式:

var Child = React.createClass({
    propTypes: {
        viewName:React.propTypes.shape({
            id:React.propTypes.number.isRequired
        }).isRequired,
        onClick:React.propTypes.func
    },
    ......

組件初始化時(shí)惧蛹,如果傳遞的屬性和propTypes不匹配,則會(huì)打印一個(gè)console.warn日志刑枝,如果是可選的配置香嗓,可以去掉.required。 在應(yīng)用使用中装畅,propTypes并不是強(qiáng)制性的靠娱,但這提供了一種極好的方式來(lái)描述組件的API。

2.3 State

每一個(gè)React組件都可以擁有自己的state洁灵,state與props的區(qū)別在于前者只存在與組件的內(nèi)部饱岸。并不是組件之間所共享的。state可以用來(lái)確定一個(gè)元素的視圖狀態(tài)徽千。

var Parent = React.createClass({
    getInitialState:function() {
        return {
            number:1
        };
    },    
    render:function() {
        return(
            <div onClick={this.onClick}>
                <button > hello {this.state.number} </button>
            </div>
            );
    },

    onClick:function() {
        this.setState({
            number:this.state.number+1
        });
    }
});

ReactDOM.render(<Parent></Parent>, document.body);

如上代碼苫费,可以通過(guò)點(diǎn)擊事件對(duì)state進(jìn)行修改,調(diào)用setState的時(shí)候双抽,會(huì)調(diào)用存在期的周期百框。也可以使用上面出現(xiàn)的getInitialState方法提供一組默認(rèn)值,只要setState被調(diào)用牍汹,render就會(huì)被調(diào)用铐维。如果render函數(shù)返回有變化柬泽,虛擬DOM就會(huì)更新,真實(shí)的DOM也會(huì)被更新嫁蛇,最終用戶會(huì)在瀏覽器中看到變化锨并。

注意:不要直接修改this.state,永遠(yuǎn)記得要通過(guò)this.setState方法修改睬棚。

3 事件

對(duì)于用戶而言第煮,展示只占整體設(shè)計(jì)因素的一半。另一半則是響應(yīng)用戶輸入抑党,即通過(guò)JavaScript處理用戶產(chǎn)生的事件包警。 React通過(guò)將時(shí)間處理器綁定到組件上來(lái)處理事件。在事件被觸發(fā)的同時(shí)底靠,更新組件的內(nèi)部狀態(tài)害晦。組件內(nèi)部狀態(tài)的更新會(huì)觸發(fā)組件重繪。因此暑中,如果視圖層想要渲染出時(shí)間觸發(fā)后的結(jié)果壹瘟,它所需要做的就是在渲染函數(shù)中讀取組件的內(nèi)部狀態(tài)。

3.1 綁定事件處理器

React處理的事件本質(zhì)上和原生的JavaScript時(shí)間一樣:MouseEvents事件用于點(diǎn)擊處理器痒芝,Change事件用于表單元素變化俐筋,等等。所有的事件在命名上和原生的JavaScript規(guī)范一致且會(huì)在相同的場(chǎng)景下被觸發(fā)严衬。 React綁定事件處理器的語(yǔ)法和HTML語(yǔ)法類似澄者。比如一個(gè)按鈕,功能是添加请琳,寫(xiě)法如下:

<button className="btn-add" onClick={this.handleAddClicked}>Add</button>

用戶點(diǎn)擊這個(gè)按鈕時(shí)粱挡,組件的handleAddClicked方法會(huì)被調(diào)用。這個(gè)方法中會(huì)包含處理Add的行為邏輯俄精。

這里我們可以懷疑onClick哪里來(lái)的呢询筏,處理onClick還支持什么事件,這里里出了MouseEvents事件:

onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp

參考: https://facebook.github.io/react/docs/events.html

3.2 事件對(duì)象

很多事件處理器只要觸發(fā)就會(huì)完成竖慧,但是有時(shí)候也會(huì)需要關(guān)于用戶輸入的跟多信息嫌套,然后有時(shí)候我們需要在輸入的時(shí)候一直在監(jiān)聽(tīng)輸入的內(nèi)容,及時(shí)的提醒給用戶輸入錯(cuò)誤的提示圾旨,提高產(chǎn)品的體驗(yàn)踱讨。

var React = require('react');
var ReactDOM = require("react-dom");

var InputListener = React.createClass({
    handleInput:function(event) {
        console.log(event.target.value);
    },

    render:function() {
        return(
            <div className="form-group">
                <div className="input-item">
                    <textarea rows="3" onChange={this.handleInput}/>
                </div>
            </div>
        );
    }
});

ReactDOM.render(<InputListener className="input">input</InputListener>, document.body);

通常會(huì)有一個(gè)事件對(duì)象傳入到React的時(shí)間處理器函數(shù)中,類似原生的JavaScript事件監(jiān)聽(tīng)器的寫(xiě)法砍的。這里的handleInput方法會(huì)接受一個(gè)事件的對(duì)象痹筛,并通過(guò)存取event.target.value互相傳遞事件對(duì)象的內(nèi)容。在事件處理器中,使用event.target.value獲取表單中的input值是一中常規(guī)的方法帚稠。

編譯腳本參考:**第5.3小節(jié):打包程序 **

4 參考

《React 引領(lǐng)未來(lái)的用戶界面開(kāi)發(fā)框架》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谣旁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子滋早,更是在濱河造成了極大的恐慌榄审,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馆衔,死亡現(xiàn)場(chǎng)離奇詭異瘟判,居然都是意外死亡怨绣,警方通過(guò)查閱死者的電腦和手機(jī)角溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)篮撑,“玉大人减细,你說(shuō)我怎么就攤上這事∮浚” “怎么了未蝌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)茧妒。 經(jīng)常有香客問(wèn)我萧吠,道長(zhǎng),這世上最難降的妖魔是什么桐筏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任纸型,我火速辦了婚禮,結(jié)果婚禮上梅忌,老公的妹妹穿的比我還像新娘狰腌。我一直安慰自己,他們只是感情好牧氮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布琼腔。 她就那樣靜靜地躺著,像睡著了一般踱葛。 火紅的嫁衣襯著肌膚如雪丹莲。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天尸诽,我揣著相機(jī)與錄音甥材,去河邊找鬼。 笑死逊谋,一個(gè)胖子當(dāng)著我的面吹牛擂达,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼板鬓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悲敷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起俭令,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤后德,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后抄腔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瓢湃,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年赫蛇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绵患。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悟耘,死狀恐怖落蝙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暂幼,我是刑警寧澤筏勒,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站旺嬉,受9級(jí)特大地震影響管行,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邪媳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一捐顷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悲酷,春花似錦套菜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至顿肺,卻和暖如春戏溺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屠尊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工旷祸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讼昆。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓托享,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闰围,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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