成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

dingDang ( 一個管理react數(shù)據(jù)層的產(chǎn)品 )

Pines_Cheng / 966人閱讀

摘要:一個管理數(shù)據(jù)層的產(chǎn)品地址我們將定義為一個產(chǎn)品而不是一個框架亦或工具包。認(rèn)識裝飾器,一切故事的開始,目前僅僅只有一個參數(shù)。我們對場景的定義多個頁面之間針對同一組業(yè)務(wù)數(shù)據(jù)進(jìn)行的一連串行為動作來完成的一組業(yè)務(wù),我們稱之為場景。

dingDang ( 一個管理react數(shù)據(jù)層的產(chǎn)品 )

github地址

我們將dingDang定義為一個產(chǎn)品而不是一個框架亦或工具包 。

因為dingDang在設(shè)計之初就將用戶的開發(fā)體驗放在第一位,而性能問題則放在第二位。

當(dāng)然這并不意味著我們就是一個性能很糟糕的產(chǎn)品,只是說我們會在性能能夠接受的范圍內(nèi)盡可能的去讓開發(fā)者的開發(fā)體驗更好。 

事實上dingDang的內(nèi)部數(shù)據(jù)全部都采用了immutable數(shù)據(jù)類型。

dingDang中使用了大量的 Promise 于 immutableJS , 如果你對此不太熟悉,可以先熟悉一下 這兩個知識點。
認(rèn)識 DingDang
DingDang裝飾器 , 一切故事的開始 , 目前 僅僅只有 sceneStorage 一個參數(shù) 。

主要用來定義場景的臨時數(shù)據(jù)存儲方案。

比如說:

在react-web 中 你應(yīng)該采用sessionStorage 或者 localStorage  , 

而在react-native 中,你應(yīng)該采用AsyncStorage 。

在sceneStorage中的3個函數(shù) 所有的返回值 要求是標(biāo)準(zhǔn)的 JS Object , set 方法的 key 我們也會傳輸一個標(biāo)準(zhǔn)的 JS Object

@DingDang({
    sceneStorage: {
        set: (k, v) => sessionStorage.setItem(k, JSON.stringify(v)),
        get: (k) => JSON.parse(sessionStorage.getItem(k)),
        del: (k) => sessionStorage.removeItem(k)
    }
})
class App extends React.Component {

    render() {
        return (
            
                
                
            
        )

    }

}

render(
    ,
    document.querySelector("#app")
)
認(rèn)識一個完整的Store
const store = {
    namespace: "demoStore",
    state: {},
    rules: {},
    reducer: {},
    effect: {},
    initialization: () => false,
    destroy: () => false
}
事實上,store中只有namespace字段是必須的,其他的字段如果你不需要的話,可以不寫。
namespace(命名空間)
該屬性的值是一個字符串 , 在dingDang中請務(wù)必保證namespace的唯一性,因為我們需要以此為依據(jù)去判定用戶是否進(jìn)入了一個全新的場景。
state (狀態(tài)機)
該屬性中主要用來存儲store中的所有數(shù)據(jù)集 , 一般來說dingDang會將這里的數(shù)據(jù)都轉(zhuǎn)換為immutable類型。
rules (規(guī)則)
首先讓我們來看一個完整的rules的案例:
export default {
    namespace: "demoStore",
    state: {
        name: "張三"
    },
    rules: {
        name: [
            {
                validate: (state, name) => name ? true : false,
                error: "用戶姓名不能為空",
                miss:false
            },
            {
                validate: (state, name) => name.length < 6,
                error: "用戶姓名最大長度不能超過6!",
                miss:true
            }
        ]
    }
}

rules 中配置的其實是針對state 中數(shù)據(jù)的校驗機制 ,比如在我們的state 中有name這個字段 ,
那么你可以在 rules中也配置一個 對應(yīng)的name字段 , 但是在rules中 , 該字段的值必須為數(shù)組, 
具體的校驗規(guī)則,我們會按照數(shù)據(jù)的先后順序來執(zhí)行。
數(shù)據(jù)中存儲的是每一個 獨立的 rule ,一個標(biāo)準(zhǔn)的 rule如下:
{
    validate: (state, name) => name ? true : false,
    error: "用戶姓名不能為空",
    miss:false
}
validate : 值為一個判斷函數(shù) , 該函數(shù)我們會自動的注入全量的state參數(shù), 以及你即將賦予字段的新值 , 
例如:name 。 這里的校驗邏輯為: 如果滿足你所需的格式 ,那么返回true , 否則false

error: 錯誤提示 , 在執(zhí)行validate得到false之后拋出的異常信息

miss : 定義是否丟失, 這里的含義是指, 如果即將賦予的新值不能滿足校驗條件, 那么新的值是否丟失掉(即不存儲進(jìn)state)
如不定義該字段, 那么該字段默認(rèn)為false , 即不丟失 ,依然賦予state。
reducer (折疊器)
該字段內(nèi)存儲的應(yīng)該都是純函數(shù) ,在這里你可以直接去針對state賦予全新的值 , 首先讓我們來看一段相對完整的reducer代碼案例:
export default {
    namespace: "orderStore",
    state: {
        goodsList: [
            {
                id: 1,
                name: "方便面",
                price: 2
            },
            {
                id: 2,
                name: "筆記本電腦",
                price: 3281
            }
        ],
        cart: []
    }
    reducer: {
        addToCart: (state, goods) => {
            return state.set("cart", state.get("cart").push(goods));
        }
    }
}
正如上面的demo所示 , 我們會為reducer 中的每一個函數(shù)的 第一個參數(shù)都注入一個全量的 immutable 類型的state ,
而第二個參數(shù)則是你在調(diào)用的時候傳入的。我們對reducer的要求是,最后你必須返回一個你期望的、全新的、全量的state。

下面我們看一段調(diào)用reducer 的案例代碼:

@Page(Store)
export default class GoodsList extends React.Component {

    static injectProps = {
        goodsList: [],
        cart: []
    }

    _addToCart = async (n) => {
        const {execReducer} = this.props;
        try {
            await execReducer("addToCart")(n)
        } catch (err) {
            console.log(err)
        }
    }

    render() {

        const {injectProps: {goodsList}} = this.props;

        return (

            
                
                    
                        
                            
                              this._addToCart(n)
                                }>加入購物車
                            }/>
                        
) } }
上述的demo中 , 我們希望你不要被過多的去關(guān)注可能對于你來說未知的代碼影響,你只需要關(guān)注我們希望闡述的內(nèi)容即可(即_addToCart函數(shù)),
首先我們應(yīng)該明確_addToCart函數(shù)是一段調(diào)用reducer的代碼 , 其次我們觀察到 , _addToCart函數(shù)采用了async await 的方式來書寫,
說明該函數(shù)是異步的 , 并且返回了一個Promise對象給我們 。

事實上,在你執(zhí)行reducer時,dingDang內(nèi)部有可能會去rules中取到對應(yīng)的規(guī)則進(jìn)行校驗,如果出現(xiàn)異常的話會reject出來給你 , 所以這里
catch到的err其實是你的rules中所配置的信息 , 同時如果你的reducer沒有任何毛病, dingDang依然會有返回值給你,這個返回值是reducer
之后的一個全新的state。

effect (副作用的)
我們將這里定義為副作用的 , 也就是希望你將所有的非純函數(shù)在這里定義(依賴于外部因素的函數(shù),相同輸入并非能保障得到相同的結(jié)果 ,比如調(diào)用API)。
慣例,讓我們看一段完整的effect案例:
export default {
    namespace: "orderStore",
    state: {
        goodsList: [],
        cart: []
    }
    reducer: {
        addToCart: (state, goods) => {
            return state.set("cart", state.get("cart").push(goods));
        }
    },
    effect:{
        queryGoodsList: async ({resolve , reject , state , execReducer , onChangeState} , params) => {
            const result = await queryGoodsListByAPI(params);
            if( result.success ){
                await onChangeState(result.goodsList).catch(err => reject(err));
                resolve(true)
            }else {
                reject( result.error )
            }
        }
    }
}
effect 的參數(shù),我們注入的比較多, resolve 、 reject 這里就不作解釋了 , 如果你不是很清楚, 建議去溫習(xí)一下Promise 。state 也不作過多的解釋了。
這里我們稍微來提一下 execReducer 和 onChangeState 這兩個函數(shù) 。 execReducer 在前面我們也見過 , 這個函數(shù)屬于dingDang的系統(tǒng)級函數(shù),主要用來
輔助你去調(diào)用reducer。  onChangeState 也是一個dingDang系統(tǒng)級函數(shù) , 這個函數(shù)是便于你直接去修改state中的數(shù)據(jù) 。
我們注意區(qū)分一下reducer 和 onChangeState 的區(qū)別 , 一般來說reducer的調(diào)用方式如下:
    execReducer("addToCart")(params);
而onChangeState的調(diào)用方式
    onChangeState(jsObjectParams)
我們總結(jié)概括一下,reducer其實是你用來去調(diào)用你自己聲明的指定的一個reducer函數(shù) , 而onChangeState 其實是直接去修改的state中的值 。 一般來說,
如果你無需做業(yè)務(wù)邏輯, 僅僅只是想把一個數(shù)據(jù)放進(jìn)state , 我們推薦你使用 onChangeState 的方式, 請不要擔(dān)心rules 的校驗問題 onChangeState 依然
會去執(zhí)行rules的校驗代碼 , 而如果您不僅僅是將一個數(shù)據(jù)放進(jìn)state , 在這中間可能還有很多業(yè)務(wù)邏輯代碼, 那么我們推薦你自己去寫一個reducer , 然后使用
execReducer 來進(jìn)行調(diào)用

initialization (store生命周期中的初始化)
initialization 是一個初始化函數(shù) , 這里不想過多的說什么 , 主要重點說一下 , 我們?yōu)檫@個函數(shù)注入了
execReducer 、 execEffect 、 onChangeState
destroy (store生命周期中的銷毀)
與initialization同理 , 注入的參數(shù)也相同

系統(tǒng)級函數(shù)介紹 execReducer
高階函數(shù) , 主要用來調(diào)用 reducer  , 返回Promise
execEffect
高階函數(shù) , 主要用來調(diào)用 effect  , 返回Promise
onChangeState
簡化修改state中值的方式

Page 裝飾器
用來裝飾一個頁面的入口 ,裝飾之后的頁面 可以使用聲明式注入 demo案例如下

@Page(store)
class Home extends React.Component {


    static injectProps = {
        initName: null,
        name: null
    }

    render() {

        const {injectProps: {initName, name}, onChangeState} = this.props;

        return (
            

{initName}

{name}

) } }
Component裝飾器
用來裝飾一個頁面下的子組件,裝飾之后的頁面 可以使用聲明式注入 demo案例如下

@Component
class Card extends React.Component {

    constructor(props) {
        super(props)
        this.state = {
            error: ""
        }
    }

    static injectProps = {
        name: null
    }

    render() {

        const {injectProps: {name}} = this.props;

        return (
            
{name}{this.state.error}
) } _onChangeName = () => { const {onChangeState} = this.props; onChangeState({name: "李四李四李四李四李四李四"}).catch(e => this.setState({error: e})) } }
injectProps (聲明式注入)
在組件中使用 static injectProps 的方式可以來聲明 讓dingDang 從store中為你注入哪些數(shù)據(jù)。

ScenePage (場景頁面)
在某些業(yè)務(wù)背景下,我們可能需要多個頁面來完整一組業(yè)務(wù)。

假設(shè)我們需要 A B C 3個頁面來完成一組業(yè)務(wù) , 在這組業(yè)務(wù)中 數(shù)據(jù)其實基本上是相同的, 針對數(shù)據(jù)的某些業(yè)務(wù)操作也是相同的。

在這種背景下,我們提出了場景的概念。

我們對場景的定義:多個頁面之間針對同一組業(yè)務(wù)數(shù)據(jù)進(jìn)行的一連串行為動作來完成的一組業(yè)務(wù),我們稱之為場景。

普通的Page裝飾器裝飾之后的頁面只能取自己獨立的那份store , 而使用ScenePage裝飾之后的多個頁面 , 只要綁定的Store
的namespace相同,那么這個Store的聲明周期將一直存在,直到用戶跳出當(dāng)前場景。

使用
npm install 0.1.1-alpha --save

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/83636.html

相關(guān)文章

  • 我是如何使用React+Redux構(gòu)建大型應(yīng)用的

    摘要:所以前端工程師不僅僅是寫好頁面和做好兼容性。對前端工程師的技術(shù)能力也會帶來考驗。這里想要說的是,如果使用了,使用了服務(wù)端渲染,對于前端工程師的個人素質(zhì)要求會比較高,因為需要處理很多服務(wù)端的問題。 背景 我們團(tuán)隊有個項目由于開發(fā)時間較長,且是前后端雜糅的開發(fā)方式,維護(hù)成本很高,在線上暴露的問題很多。而且因為對接了公司一百多條產(chǎn)品線,每天都會接到大量的客訴和產(chǎn)品線反饋的問題。2017年11...

    canopus4u 評論0 收藏0
  • 學(xué)習(xí)React系列2-[解讀]Thinking in React

    摘要:擴展單一職責(zé)原則又稱單一功能原則,面向?qū)ο笪鍌€基本原則之一。馬丁表示此原則是基于湯姆狄馬克和的著作中的內(nèi)聚性原則發(fā)展出的。 [解讀]Thinking in React 原文:http://facebook.github.io/react/docs/thinking-in-react.html 前言 Thought is the seed of action 這是放置在官方的QUICK ...

    tomorrowwu 評論0 收藏0
  • 漫談 React 組件庫開發(fā)(一):多層嵌套彈層組件

    摘要:引言組件中有很多彈出式組件,常見的如,以及等。這樣一種層次結(jié)構(gòu)在實踐中大大降低了各類彈層組件的實現(xiàn)和維護(hù)成本。但是的組件實現(xiàn)了一個大多數(shù)組件庫都沒有實現(xiàn)的功能彈層的嵌套處理。 引言 UI 組件中有很多彈出式組件,常見的如 Dialog,Tooltip 以及 Select 等。這些組件都有一個特點,它們的彈出層通常不是渲染在當(dāng)前的 DOM 樹中,而是直接插入在 body (或者其它類似的...

    warmcheng 評論0 收藏0
  • 前端每周清單第 56 期: D3 5.0,深入 React 事件系統(tǒng),SketchCode 界面生成

    摘要:雅虎從很早就開始招聘和培養(yǎng)研究型人才,雅虎研究院就是在這個過程中應(yīng)運而生的。今天我就來說一說雅虎研究院的歷史,以及過去十多年間取得的成就,聊一聊如何通過引進(jìn)高級人才,迅速構(gòu)建起一支世界級的研發(fā)團(tuán)隊。 showImg(https://segmentfault.com/img/remote/1460000013995512); 作者:王下邀月熊 編輯:徐川 前端每周清單專注大前端領(lǐng)域內(nèi)容,...

    lavnFan 評論0 收藏0
  • 那些年的體驗技術(shù)部

    摘要:隨著業(yè)務(wù)的爆發(fā),團(tuán)隊人數(shù)迅速增長起來,團(tuán)隊名也從前端開發(fā)部改名成體驗技術(shù)部,意在體現(xiàn)前端工程師的核心競爭力用技術(shù)解決產(chǎn)品體驗問題。前后端分離的研發(fā)模式在社區(qū)流行起來,體驗技術(shù)部最先實踐的是基于的應(yīng)用層方案。2008 年對中國人是復(fù)雜的一年,冰災(zāi),大地震,奧運會接踵而至。對玉伯來說也一樣,趕在奧運會排查臨時人口之前,玉伯從北京中科院軟件所離開,憑著自己幾年來在程序開發(fā)上的經(jīng)歷和對新興前端行業(yè)的...

    sean 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<