# querystring - ASP.NET狀態管理 - 格式: 在網址結尾加上一個問號(?)開始,每一組參數都是用「&」區隔開來,是一種KEY / Value的組合。 - 目的: 是附加在網頁URL結尾的資訊。主要是在Url上傳遞資料,可能是一個搜尋字串、頁碼、某項特定的指標…或類似的東西 ## 參數 - 解析和格式化URL查詢字符串的實用程序 ### querystring.escape(str) :::info 對應的解碼函數為unescape ::: - str (string) 以針對URL查詢字串執行百分比(%)編碼 。 > 不能直接用於URL編碼,它的真正作用是返回一个字符的Unicode編碼值(十六進制字符)。 ``` querystring.escape("王下邀月熊") // returns '%u738B%u4E0B%u9080%u6708%u718A' ``` ### querystring.unescape(str) :::info 對應的編碼函數為escape ::: - str (string) 對給定的URL百分比編碼字符(%)執行解碼str ``` querystring.unescape('%u738B%u4E0B%u9080%u6708%u718A') // returns '王下邀月熊' ``` ### querystring.parse(str [,sep [,eq [,options]]]) - str (string) 要解析的URL查詢字串 - sep (string) Separator 分隔查詢字串中的鍵和值的字元。默認為'&'。 - eq (string) 分隔查詢字串中的鍵和值的字元。默認為'='。 > 該querystring.parse()方法將URL查詢字串(str)解析為鍵和值對的集合。 例如,查詢字串 'foo=bar&abc=xyz&abc=123' 被解析為: ``` { foo: 'bar', abc: ['xyz', '123'] } ``` :::warning querystring.parse()方法回傳的對象在原型上並不是javascript擴展的Object。代表常用的Object方法,例如obj.toString(),obj.hasOwnProperty()和其他人都沒有定義,因此將無法正常工作。 ::: - options (object) - decodeURIComponent (Function) 在對查詢字串中的百分比編碼(%)的字符進行解碼時使用的函數。默認為 querystring.unescape()。 > 默認情況下,查詢字串中的百分比編碼(%)字符將被假定為使用UTF-8編碼。如果使用替代字符編碼,則decodeURIComponent需要指定替代選項: ``` // Assuming gbkDecodeURIComponent function already exists... querystring.parse('w=%D6%D0%CE%C4&foo=bar', null, null,{ decodeURIComponent: gbkDecodeURIComponent }) ``` - maxKeys (number) 要解析的鍵的最大數量。默認為1000。指定0刪除鍵計數限制。 ``` querystring.parse("name=whitemu&sex=man&sex=women") // returns: { name: 'whitemu', sex: [ 'man', 'women' ] } 加入option {maxKeys:2} : querystring.parse("name=whitemu#sex=man#sex=women","#",null,{maxKeys:2}) //returns: { name: 'whitemu', sex: 'man' } ``` ### querystring.stringify(obj [,sep [,eq [,options]]]) :::info 相當於 parse 的逆向操作 ::: - obj (Object) 要序列化為URL查詢字符串的對象 - sep (string) Separator 分隔查詢字串中的鍵和值對的字元。默認為'&'。 - eq (string) 分隔查詢字串中的鍵和值的字元。默認為'='。 > 該querystring.stringify()方法obj通過遍歷對象的"自身屬性",從給定值生成URL查詢字串。 它序列化傳入的以下類型的obj值: string ,數字 ,布林值 ,string [ ] ,number [ ] ,boolean [ ] 其他任何輸入值將被強制為空字符串。 ``` querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' }); // returns 'foo=bar&baz=qux&baz=quux&corge=' querystring.stringify({ foo: 'bar', baz: 'qux' }, ';', ':'); // returns 'foo:bar;baz:qux' ``` - options (object) - encodeURIComponent (Function) 在查詢字串中將URL不安全字符轉換為百分比編碼(%)時使用的函數。默認為 querystring.escape()。 > 默認情況下,要求在查詢字串中進行百分比編碼(%)的字符將被編碼為UTF-8。如果需要替代編碼,則encodeURIComponent需要指定替代選項: ``` // Assuming gbkEncodeURIComponent function already exists... querystring.stringify({ w: '中文', foo: 'bar' }, null, null,{ encodeURIComponent: gbkEncodeURIComponent }); ``` ## FaceAI 應用 ### querystring.parse ``` // containers/routes/Face.js // containers/routes/Capture.js // 利用querystring.parse 將state中location.search字串轉換成object const query = querystring.parse(location.search.substring(1)) ``` ``` // selectors/index.js // 利用createSelector(陣列,轉換的function)建立getQuery搜尋器 router.location.search內容即為query // getQuery將query(string)先將?取代為空字串再轉換為object const routerSelector = state => state.router export const getQuery = createSelector(routerSelector, router => { const { location: { search: query = '' } } = router return querystring.parse(query.replace('?', '')) }) ``` ``` // containers/routes/Log.js const mapStateToProps = state => { const query = getQuery(state) if (!query.isSystem) { query.isSystem = '0' } return { logs: entitySelector.logs(state), meta: state.meta.logs, query } } ``` ### querystring.stringify ``` // utils/index.js // 利用querystring.stringify將filteredObj(搜尋條件-json object)轉換為字串 export const queryToString = (query = {}) => { const filteredObj = Object.keys(query) .filter(key => typeof query[key] !== 'undefined' && query[key] !== '' && query[key] !== null) .reduce( (obj, key) => ({ ...obj, [key]: query[key] }), {} ) return querystring.stringify(filteredObj) } ``` ``` // components/Log/index.js // 將各個按鍵造成的搜尋結果(Object)轉換成字串 const handleSearch = values => { push({ search: queryToString({ ...query, ...values, page: 1 }) }) } const handleRest = () => { push({ search: queryToString({ isSystem: tabKey }) }) } const handlePageChange = (page, pageSize) => { push({ search: queryToString({ ...query, page, pageSize }) }) } const handleTabChange = activeKey => { push({ search: `?isSystem=${activeKey}` }) } useEffect(() => { fetchLogs(query) }, []) ``` ``` // compoments/Log/Filter.js // 匯出紀錄之API href={`${API_URL}/logs/_/export?${queryToString(exportQuery)}`} ``` ## package - querystring-es3@0.2.0 - querystring@0.2.0 - querystringify@^2.1.1