第一次探索這個框架,對於裡面很多邏輯是不懂的,所以只能一點一點去揣摩,其中做了什麼。
而學習過程中,總是禁不住好奇這裡的邏輯是幹什麼的,那裡的邏輯是什麼的,在不理解這段邏輯是做什麼的情況下,死磕很容易事倍功半。所以本次先從乙個比較簡單的場景入手,看看它的原始碼中做了什麼手腳,至於有些邏輯沒有涉及到的,先不去管它就好了。
首先上圖,看看這次案例的效果。
}}ps: 原始碼分析以**+備註的形式展示
import createbaseform from './createbaseform';這裡我們看到,其實createform本身沒做什麼事情,只是在該檔案內定義了混入的格式。// 一系列給其他元件用的自定義混入
export const mixin = ;
},};function createform(options)
export default createform;
接下來我們的重點是createbaseform中做了什麼。這裡只列出跟我們案例相關的內容
//整體結構
function createbaseform(options={}, mixins={} ) = option;
const form = createreactclass(
componentwillreceiveprops(nextprops)
oncollect()
oncollectcommon() {}
getcachebind()
getfielddecorator()
getfieldprops()
// 一些其他函式
render() ;
// ** 精簡本次分析無關的**
// 這裡用了乙個小技巧,就是call(this,***),直接將該元件上的核心方法,全都放到了子元件的屬性上,而且由於該元件是createreactclass建立的,所以子元件(本例中的form)呼叫這些從父元件獲取的方法時,方法內部的this,指向當前元件。
...formprops,
...restprops,
});},
},})
//簡化靜態方法轉移部分
return form;}}
當createbaseform函式在渲染函式中返回了我們的form元件後,就可以看到form元件中做的事情。
form.js
class form extends react.component ;
componentwillmount()
onsubmit = (e) => else
});};
onchange = (e) =>
render() = this.props.form;
return ();
}}
重點了。關鍵是看看getfielddecorator中做了什麼。
getfielddecorator(name, fieldoption) );
};},
其中getfieldprops
值得我們關注
// 簡化後的內容如下
getfieldprops(name, usersfieldoption = {}) ;
const = fieldoption;
// 第一次get元資料一般得不到,內部會返回個空物件
const fieldmeta = this.fieldsstore.getfieldmeta(name);
if ('initialvalue' in fieldoption)
// 這裡的inputprops簡化後結果為,第一次為空。
const inputprops = ;
// make sure that the value will be collect
// 這裡用來在getfielddecorator第二個引數為空時,確保給input繫結乙個基本的onchange事件來收集input的修改值,最終放入fieldsstore中
if (trigger && validatetriggers.indexof(trigger) === -1)
// 這裡就是我們fieldsstore中設定的元資料
const meta = ;
this.fieldsstore.setfieldmeta(name, meta);
// 這裡返回的;
return inputprops;
},
上述**中onchange繫結了乙個oncollect,其中getcachebind函式主要是修正函式使用時候this指標。此處忽略直接分析oncollect
oncollect(name_, action, ...args) = this.oncollectcommon(name_, action, args);
const = fieldmeta;
const newfield = ;
// 更新fieldstore中的值,主要觸發了乙個forceupdate方法,重新渲染該元件
this.setfields();
},
最後關鍵的一步就是看看oncollectcommon做了什麼
oncollectcommon(name, action, args) else if (fieldmeta.originalprops && fieldmeta.originalprops[action])
// 此處的getvaluefromevent其實就是取e.target.value.
const value = fieldmeta.getvaluefromevent ?
fieldmeta.getvaluefromevent(...args) :
getvaluefromevent(...args);
const field = this.fieldsstore.getfield(name);
return (, fieldmeta });
},
至此整個資料流程基本跑通,onchange
觸發oncollect
去改變fieldstore
中的值並forceupdate
更新介面,oncollectcommon
則展示了oncollect
取值的細節。forceupdate
更新元件後,觸發form
的render
方法,又開始了之前getfielddecorator
中讀取fieldstore中值,返回被修改後的元件的流程。
跑通了最簡單的場景,就可以向下一步更複雜的場景探索了。
至此乙個最簡單的流程已經分析完畢。接下來,需要考慮的就是表單驗證,資料反顯(從後端拿到資料渲染編輯頁面)等等,一步乙個腳印,慢慢來吧。
Python練習題19 《沉默的羔羊》之最多單詞
e lx 沉默的羔羊.txt encoding utf 8 read words jieba.lcut txt 精確模式分詞,返回乙個列表型別 d 建立乙個空字典,用來存放鍵值對資料 for word in words d word d.get word,0 1 如果這個詞語 鍵 在字典中,其值 1...
世界樹木之最
最高的樹 澳洲的杏仁桉,普遍高達百餘公尺,最高達156公尺,相當於50層的高樓,要比2幢 上海國際飯店 還要高。最老的樹 美國加利福利亞州的一棵名叫麥修徹拉的刺球果松,樹齡高達6400歲 另外還有一棵是非洲西部加那利亞島的龍血樹,已經活了8000多歲,可惜的是在1868年毀於一場風災。最重的木 雲南...
中位數之最
給出乙個長度為 n 的序列 a 你能任選乙個區間長度區不小於 k 的區間,那麼在這些的區間中能得到的區間中位數最大值是多少?此題中位數指 有 n 個數,第 lfloor frac rfloor 個數記為中位數。資料範圍 1 k n 2 10 5,1 a i n 把所以滿足條件的區間中位數都放入乙個集...