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

資訊專欄INFORMATION COLUMN

[譯] React.js 模式

mumumu / 878人閱讀

摘要:此時,我將它寫下來討論和分享這些我發(fā)現(xiàn)的模式。正確的姿勢應(yīng)該是通過的方式獲取子組件的一些信息。高階組件是需要另外一個有用的模式依賴注入。也有部分人稱它是一種模式。最直接的方式是通過每一層通過來傳遞。

原文出自:http://krasimirtsonev.com/blog/article/react-js-in-design-patterns

前言

我想找一個好的前端前端框架,找了很久。這個框架將能夠幫助我寫出具有可擴展性、可維護性 UI 的代碼。通過對 React.js 優(yōu)勢的理解,我認為“我找到了它”。在我大量的使用過程中,我發(fā)現(xiàn)了一些模式性的東西。這些技術(shù)被一次又一次的用于編程開發(fā)之中。此時,我將它寫下來、討論和分享這些我發(fā)現(xiàn)的模式。

這些所有的代碼都是可用的,能夠在 https://github.com/krasimir/react-in-patterns 中下載。我可能不會更新我的博客,但是我將一直在 GitHub 中發(fā)布一些東西。我也將鼓勵你在 GitHub 中討論這些模式,通過 issue 或者直接 pull request 的方式。

一、React 自己的交流方式(Communication)

在使用 React 構(gòu)建了幾個月的情況下,你將能夠體會到每一個 React Component 都是一個小系統(tǒng),它能夠自己運作。它有自己的 state、input、output.

Input

React Component 通過 props 作為 input(之后用輸入代替)。下面我們來寫一個例子:

// Title.jsx
class Title extends React.Component {
    render() {
        return 

{ this.props.text }

; } }; Title.propTypes = { text: React.PropTypes.string }; Title.defaultProps = { text: "Hello world" }; // App.jsx class App extends React.Component { render() { return ; } };</pre> <p>其中的 <b>Title</b> 組件只有一個輸入 - <b>text</b>. 在父組件(App)提供了一個屬性,通過 <b><Title></b> 組件。在 <b>Title</b> 組件中我們添加了兩個設(shè)置 <b>propTypes</b> 和 <b>defaultProps</b>,我們來多帶帶看一下:</p> <p><p>propTypes - 定義 props 的類型,這將幫助我們告訴 React 我們將傳什么類型的 prop,能夠?qū)@個 prop 進行驗證(或者說是測試)。</p></p> <p><p>defaultProps - 定義 props 默認的值,設(shè)置一個默認值是一個好習慣。</p></p> <p>還有一個 <b>props.children</b> 屬性,能夠讓我們訪問到當前組件的子組件。比如:</p> <pre>class Title extends React.Component { render() { return ( <h1> { this.props.text } { this.props.children } </h1> ); } }; class App extends React.Component { render() { return ( <Title text="Hello React"> <span>community</span> ); } };

值得注意的是:如果我們沒有在 Title 組件的 render 方法中添加 { this.props.children } 代碼,其中的 span 標簽(孩子組件)將不會被渲染。

對于一個組件的間接性輸入(就是多層組件傳遞數(shù)據(jù)的時候),我們也可以調(diào)用 context 進行數(shù)據(jù)的訪問。在整個 React tree 中的每一個組件中可能會有一個 context 對象。更多的說明將在依賴注入章節(jié)講解。

Output

React 的輸出就是渲染過后的 HTML 代碼。在視覺上我們將看到一個 React 組件的樣子。當然,有些組件可能包含一些邏輯,能夠幫助我們傳遞一些數(shù)據(jù)或者觸發(fā)一個事件行為(這類組件可能不會有具體的 UI 形態(tài))。為了實現(xiàn)邏輯類型的組件,我們將繼續(xù)使用組件的 props:

class Title extends React.Component {
    render() {
        return (
            

); } }; class App extends React.Component { render() { return ; } logoClicked() { console.log("logo clicked"); } };</pre> <p>我們通過一個 callback 的方式在子組件中進行調(diào)用,<b>logoClicked</b> 方法能夠接受一些數(shù)據(jù),這樣我們就能夠從子組件向父組件傳輸一些數(shù)據(jù)了(這里就是 React 方式的子組件向父組件通信)。</p> <p>我們之前有提到我們不能夠訪問 child 的 state。或者換句話說,我們不能夠使用 this.props.children[0].state 的方式或者其他什么方式去訪問。正確的姿勢應(yīng)該是通過 props callback 的方式獲取子組件的一些信息。這是一件好事。這就迫使我們要去定義明確的 APIs,并鼓勵使用單向數(shù)據(jù)流(在后面的<b>單向數(shù)據(jù)流</b>中將介紹)。</p> <b>二、組件構(gòu)成(composition)</b> <pre><p>源碼:https://github.com/krasimir/r...</p></pre> <p>另外一個很棒的是 React 的可組合性。對于我來說,除了 React 之外還沒有發(fā)現(xiàn)有任何框架能夠如此簡單的方式去創(chuàng)建組件以及合并組件。這段我將探索一些組件的構(gòu)建方式,來讓開發(fā)工作更加棒。</p> <p>讓我們先來看一個簡單的例子:</p> <p><p>假設(shè)我們有一個應(yīng)用,包含 header 部分,header 內(nèi)部有一個 navigation(導航)組件。</p></p> <p><p>所以,我們將有三個 React 組件:App、Header 和 Navigation。</p></p> <p><p>他們是層級嵌套的關(guān)系。</p></p> <p>所以最后代碼如下:</p> <pre><App> <Header> <Navigation> ... </Navigation> </Header> </App></pre> <p>我們?yōu)榱私M合這些小組件,并且引用他們,我們需要向下面這樣定義他們:</p> <pre>// app.jsx import Header from "./Header.jsx"; export default class App extends React.Component { render() { return <Header />; } } // Header.jsx import Navigation from "./Navigation.jsx"; export default class Header extends React.Component { render() { return <header><Navigation /></header>; } } // Navigation.jsx export default class Navigation extends React.Component { render() { return (<nav> ... </nav>); } }</pre> <p>然而這樣,我們用這種方式去組織組件會有幾個問題:</p> <p><p>我們將 App 組件做為程序的入口,在這個組件里面去構(gòu)建組件是一個不錯的地方。對于 Header 組件,可能會包含其他組件,比如 logo、search 或者 slogan 之類的。它將是非常好處理,可以通過某種方式從外部傳入,因此我們沒有需要創(chuàng)建一個強依賴的組件。如果我們在另外的地方需要使用 Header 組件,但是這個時候又不需要內(nèi)層的 Navigation 子組件。這個時候我們就不容易實現(xiàn),因為 Header 和 Navigation 組件是兩個強耦合的組件。</p></p> <p><p>這樣編寫組件是不容易測試的,我們可能在 Header 組件中有一些業(yè)務(wù)邏輯,為了測試 Header 組件,我們就必須要創(chuàng)建一個 Header 的實例(其實就是引用組件來渲染)。然而,又因為 Header 組件依賴了其他組件,這就導致了我們也可能需要創(chuàng)建一些其他組件的實例,這就讓測試不是那么容易。并且我們在測試過程中,如果 Navigation 組件測試失敗,也將導致 Header 組件測試失敗,這將導致一個錯誤的測試結(jié)果(因為不會知道是哪個組件測試沒有通過)。(注:然后在測試中 shallow rendering 解決了這個問題,能夠只渲染 Header 組件,不用實例化其他組件)。</p></p> <p><strong>使用 React"s children API</strong></p> <p>在 React 中,我們能夠通過 <b>this.props.children</b> 來很方便的處理這個問題。這個屬性能夠讓父組件讀取和訪問子組件。這個 API 將使我們的 Header 組件更抽象和低耦合(原文是 dependency-free 不好翻譯,但是是這個意思)。</p> <pre>// App.jsx export default class App extends React.Component { render() { return ( <Header> <Navigation /> </Header> ); } } // Header.jsx export default class Header extends React.Component { render() { return <header>{ this.props.children }</header>; } }</pre> <p>這將容易測試,因為我們可以讓 Header 組件渲染成一個空的 div 標簽。這就讓組件脫離出來,然后只專注于應(yīng)用的開發(fā)(其實就是抽象了一層父組件,然后讓這個父組件和子組件進行了解耦,然后子組件可能才是應(yīng)用的一些功能實現(xiàn))。</p> <p><strong>將 child 做為一個屬性</strong></p> <p>每一個 React 組件都接受 props。這非常好,這個 props 屬性能包含一些數(shù)據(jù)?;蛘哒f是其他組件。</p> <pre>// App.jsx class App extends React.Component { render() { var title = <h1>Hello there!</h1>; return ( <Header title={ title }> <Navigation /> </Header> ); } }; // Header.jsx export default class Header extends React.Component { render() { return ( <header> { this.props.title } <hr /> { this.props.children } </header> ); } };</pre> <p>這個技術(shù)在我們要合并兩個組件,這個組件在 Header 內(nèi)部的時候是非常有用的,以及在外部提供這個需要合并的組件。</p> <b>三、高階組件(Higher-order components)</b> <pre><p>源碼:https://github.com/krasimir/r...</p></pre> <p>高階組件看起來很像裝飾器模式。他是包裹一個組件和附加一些其他功能或者 props 給它。</p> <p>這里通過一個函數(shù)來返回一個高階組件:</p> <pre>var enhanceComponent = (Component) => class Enhance extends React.Component { render() { return ( <Component {...this.state} {...this.props} /> ) } }; export default enhanceComponent;</pre> <p>我們經(jīng)常提供一個工廠函數(shù),接受我們的原始組件,當我們需要訪問的時候,就返回這個 被升級或者被包裹 過的組件版本給它。比如:</p> <pre>var OriginalComponent = () => <p>Hello world.</p>; class App extends React.Component { render() { return React.createElement(enhanceComponent(OriginalComponent)); } };</pre> <p>首先,高階組件其實也是渲染的原始組件(傳入的組件)。一個好的習慣是直接傳入 state 和 props 給它。這將有助于我們想代理數(shù)據(jù)和像是用原始組件一樣去使用這個高階組件。</p> <p>高階組件讓我們能夠控制輸入。這些數(shù)據(jù)我們想通過 props 進行傳遞?,F(xiàn)在像我們說的那樣,我們有一個配置,OriginalComponent 組件需要這個配置的數(shù)據(jù),代碼如下:</p> <pre>var config = require("path/to/configuration"); var enhanceComponent = (Component) => class Enhance extends React.Component { render() { return ( <Component {...this.state} {...this.props} title={ config.appTitle } /> ) } };</pre> <p>這個配置是隱藏在高階組件中。OriginalComponent 組件只能通過 props 來調(diào)用 title 數(shù)據(jù)。至于 title 數(shù)據(jù)從哪里來對于 OriginalComponent 來說并不重要(這就非常棒了!封閉性做的很好)。這是極大的優(yōu)勢,因為它幫助我們測試獨立組件,以及提供一個好的機制去 mocking 數(shù)據(jù)。這里能夠這樣使用 title 屬性( 也就是 stateless component[無狀態(tài)組件] )。</p> <pre>var OriginalComponent = (props) => <p>{ props.title }</p>;</pre> <p>高階組件是需要另外一個有用的模式-依賴注入(dependency injection)。</p> <b>四、依賴注入(Dependency injection)</b> <pre><p>源碼:https://github.com/krasimir/r...</p></pre> <p>大部分模塊/組件都會有依賴。能夠合理的管理這些依賴能夠直接影響到項目是否成功。有一個技術(shù)叫:依賴注入(dependency injection,之后我就簡稱 DI 吧)。也有部分人稱它是一種模式。這種技術(shù)能夠解決依賴的問題。</p> <p>在 React 中 DI 很容易實現(xiàn),讓我們跟著應(yīng)用來思考:</p> <pre>// Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from "./Title.jsx"; export default function Header() { return ( <header> <Title /> </header> ); } // App.jsx import Header from "./Header.jsx"; class App extends React.Component { constructor(props) { super(props); this.state = { title: "React in patterns" }; } render() { return <Header />; } };</pre> <p>有一個 "React in patterns" 的字符串,這個字符串以某種方式來傳遞給 Title 組件。</p> <p>最直接的方式是通過: App => Header => Title 每一層通過 props 來傳遞。然而這樣可能在這個三個組件的時候比較方便,但是如果有多個屬性以及更深的組件嵌套的情況下將比較麻煩。大量組件將接收到它們并不需要的屬性(因為是逐層傳遞)。</p> <p>我們前面提到的高階組件的方式能夠用來注入數(shù)據(jù)。讓我們用這個技術(shù)來注入一下 title 變量。</p> <pre>// enhance.jsx var title = "React in patterns"; var enhanceComponent = (Component) => class Enhance extends React.Component { render() { return ( <Component {...this.state} {...this.props} title={ title } /> ) } }; // Header.jsx import enhance from "./enhance.jsx"; import Title from "./Title.jsx"; var EnhancedTitle = enhance(Title); export default function Header() { return ( <header> <EnhancedTitle /> </header> ); }</pre> <p>這個 title 是隱藏在中間層(高階組件)中,我們通過 prop 來傳遞給 Title 組件。這很好的解決了,但是這只是解決了一半問題,現(xiàn)在我們沒有層級的方式去傳遞 title,但是這些數(shù)據(jù)都在 echance.jsx 中間層組件。</p> <p>React 有一個 context 的概念,這個 context 能夠在每一個組件中都可以訪問它。這個優(yōu)點像 event bus 模型,只不過這里是一個數(shù)據(jù)。這個方式讓我們能夠在任何地方訪問到數(shù)據(jù)。</p> <pre>// 我們定義數(shù)據(jù)的地方:context => title var context = { title: "React in patterns" }; class App extends React.Component { getChildContext() { return context; } ... }; App.childContextTypes = { title: React.PropTypes.string }; // 我們需要這個數(shù)據(jù)的地方 class Inject extends React.Component { render() { var title = this.context.title; ... } } Inject.contextTypes = { title: React.PropTypes.string };</pre> <pre><p>值得注意的是我們必須使用 childContextTypes 和 contextTypes 這兩個屬性,定義這個上下文對象的類型聲明。如果沒有聲明,context 這個對象將為空(經(jīng)我測試,如果沒有這些類型定義直接報錯了,所以一定要記得加上哦)。這可能有些不太合適的地方,因為我們可能會放大量的東西在這里。所以說 context 定義成一個純對象不是很好的方式,但是我們能夠讓它成為一個接口的方式來使用它,這將允許我們?nèi)ゴ鎯瞳@取數(shù)據(jù),比如:</p></pre> <pre>// dependencies.js export default { data: {}, get(key) { return this.data[key]; }, register(key, value) { this.data[key] = value; } }</pre> <p>然后,我們再看一下我們的例子,頂層的 App 組件可能就會像這樣寫:</p> <pre>import dependencies from "./dependencies"; dependencies.register("title", "React in patterns"); class App extends React.Component { getChildContext() { return dependencies; } render() { return <Header />; } }; App.childContextTypes = { data: React.PropTypes.object, get: React.PropTypes.func, register: React.PropTypes.func };</pre> <p>然后,我們的 Title 組件就從這個 context 中獲取數(shù)據(jù):</p> <pre>// Title.jsx export default class Title extends React.Component { render() { return <h1>{ this.context.get("title") }</h1> } } Title.contextTypes = { data: React.PropTypes.object, get: React.PropTypes.func, register: React.PropTypes.func };</pre> <p>最好的方式是我們在每次使用 context 的時候不想定義 contextTypes。這就是能夠使用高階組件包裹一層。甚至更多的是,我們能夠?qū)懸粋€多帶帶的函數(shù),去更好的描述和幫助我們聲明這個額外的地方。之后通過 this.context.get("title") 的方式直接訪問 context 數(shù)據(jù)。我們通過高階組件獲取我們需要的數(shù)據(jù),然后通過 prop 的方式來傳遞給我們的原始組件,比如:</p> <pre>// Title.jsx import wire from "./wire"; function Title(props) { return <h1>{ props.title }</h1>; } export default wire(Title, ["title"], function resolve(title) { return { title }; });</pre> <p>這個 wire 函數(shù)有三個參數(shù):</p> <p><p>一個 React 組件</p></p> <p><p>需要依賴的數(shù)據(jù),這個數(shù)據(jù)以數(shù)組的方式定義</p></p> <p><p>一個 mapper 的函數(shù),它能接受上下文的原始數(shù)據(jù),然后返回一個我們的 React 組件(比如 Title 組件)實際需要的數(shù)據(jù)對象(相當于一個 filter 管道的作用)。</p></p> <p>這個例子我們只是通過這種方式傳遞來一個 title 字符串變量。然后在實際應(yīng)用開發(fā)過程中,它可能是一個數(shù)據(jù)的存儲集合,配置或者其他東西。因此,我們通過這種方式,我們能夠通過哪些我們確實需要的數(shù)據(jù),不用去污染組件,讓它們接收一些并不需要的數(shù)據(jù)。</p> <p>這里的 wire 函數(shù)定義如下:</p> <pre>export default function wire(Component, dependencies, mapper) { class Inject extends React.Component { render() { var resolved = dependencies.map(this.context.get.bind(this.context)); var props = mapper(...resolved); return React.createElement(Component, props); } } Inject.contextTypes = { data: React.PropTypes.object, get: React.PropTypes.func, register: React.PropTypes.func }; return Inject; };</pre> <p>Inject 是一個高階組件,它能夠訪問 context 對象的 dependencies 所有的配置項數(shù)組。這個 mapper 函數(shù)能夠接收 context 的數(shù)據(jù),并轉(zhuǎn)換它,然后給 props 最后傳遞到我們的組件。</p> <p><strong>最后來看一下關(guān)于依賴注入</strong></p> <p>在很多解決方案中,都使用了依賴注入的技術(shù),這些都基于 React 組件的 context 屬性。我認為這很好的知道發(fā)生了什么。在寫這篇文憑的時候,大量流行構(gòu)建 React 應(yīng)用的方式會需要 Redux。著名 connect 函數(shù)和 Provider 組件,就是使用的 context(現(xiàn)在大家可以看一下源碼了)。</p> <p>我個人發(fā)現(xiàn)這個技術(shù)是真的有用。它是滿足了我處理所有依賴數(shù)據(jù)的需要,使我的組件變得更加純粹和更方便測試。</p> <b>五、單向數(shù)據(jù)流(One-way direction data flow)</b> <pre><p>源碼:https://github.com/krasimir/r...</p></pre> <p>在 React 中單向數(shù)據(jù)流的模式運作的很好。它讓組件不用修改數(shù)據(jù),只是接收它們。它們只監(jiān)聽數(shù)據(jù)的改變和可能提供一些新的值,但是它們不會去改變數(shù)據(jù)存儲器里面實際的數(shù)據(jù)。更新會放在另外地方的機制下,和組件只是提供渲染和新的值。</p> <p>讓我們來看一個簡單的 Switcher 組件的例子,這個組件包含了一個 button。我們點擊它將能夠控制切換(flag 不好翻譯,程序員都懂的~)</p> <pre>class Switcher extends React.Component { constructor(props) { super(props); this.state = { flag: false }; this._onButtonClick = e => this.setState({ flag: !this.state.flag }); } render() { return ( <button onClick={ this._onButtonClick }> { this.state.flag ? "lights on" : "lights off" } </button> ); } }; // ... and we render it class App extends React.Component { render() { return <Switcher />; } };</pre> <p>這個時候再我們的組件里面有一個數(shù)據(jù)。或者換句話說:Switcher 只是一個一個我們需要通過 flag 變量來渲染的地方。讓我們發(fā)送它到一個外面的 store 中:</p> <pre>var Store = { _flag: false, set: function (value) { this._flag = value; }, get: function () { return this._flag; } }; class Switcher extends React.Component { constructor(props) { super(props); this.state = { flag: false }; this._onButtonClick = e => { this.setState({ flag: !this.state.flag }, () => { this.props.onChange(this.state.flag); }); } } render() { return ( <button onClick={ this._onButtonClick }> { this.state.flag ? "lights on" : "lights off" } </button> ); } }; class App extends React.Component { render() { return <Switcher onChange={ Store.set.bind(Store) } />; } };</pre> <p>我們的 Store 對象是單例 我們有 helper 去設(shè)置和獲取 _flag 這個屬性的值。通過 getter,然后組件能夠通過外部數(shù)據(jù)進行更新。大楷我們的應(yīng)用工作流看起來是這樣的:</p> <pre>User"s input | Switcher -------> Store </pre> <p>讓我們假設(shè)我們要通過 Store 給后端服務(wù)去保存這個 flag 值。當用戶返回的時候,我們必須設(shè)置合適的初始狀態(tài)。如果用戶離開后在后來,我們必須展示 "lights on" 而不是默認的 "lights off"。現(xiàn)在它變得困難,因為我們的數(shù)據(jù)是在兩個地方。UI 和 Store 中都有自己的狀態(tài),我們必須在它們之間交流:Store --> Switcher 和 Switcher --> Store。</p> <pre>// ... in App component <Switcher value={ Store.get() } onChange={ Store.set.bind(Store) } /> // ... in Switcher component constructor(props) { super(props); this.state = { flag: this.props.value }; ... </pre> <p>我們的模型改變就要通過:</p> <pre>User"s input | Switcher <-------> Store ^ | | | | | | v Service communicating with our backend </pre> <p>所有這些都導致了需要管理兩個狀態(tài)而不是一個。如果 Store 的改變是通過其他系統(tǒng)的行為,我們就必須傳送這些改變給 Switcher 組件和我們就增加了自己 App 的復雜度。</p> <p>單向數(shù)據(jù)流就解決了這個問題。它消除了這種多種狀態(tài)的情況,只保留一個狀態(tài),這個狀態(tài)一般是在 Store 里面。為了實現(xiàn)單向數(shù)據(jù)流這種方式,我們必須簡單修改一下我們的 Store 對象。我們需要一個能夠訂閱改變的邏輯。</p> <pre>var Store = { _handlers: [], _flag: "", onChange: function (handler) { this._handlers.push(handler); }, set: function (value) { this._flag = value; this._handlers.forEach(handler => handler()) }, get: function () { return this._flag; } };</pre> <p>然后我們將有一個鉤子在主要的 App 組件中,我們將在每次 Store 中的數(shù)據(jù)變化的時候重新渲染它。</p> <pre>class App extends React.Component { constructor(props) { super(props); Store.onChange(this.forceUpdate.bind(this)); } render() { return ( <div> <Switcher value={ Store.get() } onChange={ Store.set.bind(Store) } /> </div> ); } };</pre> <p><strong>注</strong>:我們使用了 forceUpdate 的方式,但這種方式不推薦使用。一般情況能夠使用高階組件進行重新渲染。我們使用 forceUpdate 只是簡單的演示。</p> <p>因為這個改變,Switcher 變得比之前簡單。我們不需要內(nèi)部的 state:</p> <pre>class Switcher extends React.Component { constructor(props) { super(props); this._onButtonClick = e => { this.props.onChange(!this.props.value); } } render() { return ( <button onClick={ this._onButtonClick }> { this.props.value ? "lights on" : "lights off" } </button> ); } };</pre> <p>這個好處在于:這個模式讓我們的組件變成了展示 Store 數(shù)據(jù)的一個填鴨式組件。它是真的讓 React 組件變成了純粹的渲染層。我們寫我們的應(yīng)用是聲明的方式,并且只在一個地方處理一些復雜的數(shù)據(jù)。</p> <p>這個應(yīng)用的工作流就變成了:</p> <pre>Service communicating with our backend ^ | v Store <----- | | v | Switcher ----> ^ | | User input </pre> <p>我們看到這個數(shù)據(jù)流都是一個方向流動的,并且在我們的系統(tǒng)中,不需要同步兩個部分(或者更多部分)。單向數(shù)據(jù)流不止能基于 React 應(yīng)用,這些就是它讓應(yīng)用變得更簡單的原因,這個模式可能還需要更多的實踐,但是它是確實值得探索的。</p> <b>六、結(jié)語</b> <p>當然,這不是在 React 中所有的設(shè)計模式/技術(shù)。還可能有更多的模式,你能夠 checkout github.com/krasimir/react-in-patterns 進行更新。我將努力分享我新的發(fā)現(xiàn)。</p> </div> <div id="qoyqs8suu2u" class="mt-64 tags-seach" > <div id="qoyqs8suu2u" class="tags-info"> <a style="width:120px;" title="GPU云服務(wù)器" href="http://systransis.cn/site/product/gpu.html">GPU云服務(wù)器</a> <a style="width:120px;" title="云服務(wù)器" href="http://systransis.cn/site/active/kuaijiesale.html?ytag=seo">云服務(wù)器</a> <a style="width:120px;" title="React.js" href="http://systransis.cn/yun/tag/React.js/">React.js</a> <a style="width:120px;" title="react.js cdn" href="http://systransis.cn/yun/tag/react.js cdn/">react.js cdn</a> <a style="width:120px;" title="linux下編譯阿里" href="http://systransis.cn/yun/tag/linuxxiabianyiali/">linux下編譯阿里</a> <a style="width:120px;" title="linux下編譯運行" href="http://systransis.cn/yun/tag/linuxxiabianyiyunxing/">linux下編譯運行</a> </div> </div> <div id="qoyqs8suu2u" class="entry-copyright mb-30"> <p class="mb-15"> 文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。</p> <p>轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80344.html</p> </div> <ul class="pre-next-page"> <li id="qoyqs8suu2u" class="ellipsis"><a class="hpf" href="http://systransis.cn/yun/80343.html">上一篇:關(guān)于easyui datebox 的選擇器,屬性 以及 取值。</a></li> <li id="qoyqs8suu2u" class="ellipsis"><a class="hpf" href="http://systransis.cn/yun/80345.html">下一篇:《JavaScript 闖關(guān)記》之對象</a></li> </ul> </div> <div id="qoyqs8suu2u" class="about_topicone-mid"> <h3 class="top-com-title mb-0"><span data-id="0">相關(guān)文章</span></h3> <ul class="com_white-left-mid atricle-list-box"> <li> <div id="qoyqs8suu2u" class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="http://systransis.cn/yun/85537.html"><b>Flux再進化:Introducing Relay and GraphQL<em>譯</em></b></a></h2> <p class="ellipsis2 good">摘要:它的設(shè)計使得即使是大型團隊也能以高度隔離的方式應(yīng)對功能變更。獲取數(shù)據(jù)數(shù)據(jù)變更性能,都是讓人頭痛的問題。通過維護組件與數(shù)據(jù)間的依賴在依賴的數(shù)據(jù)就緒前組件不會被渲染為開發(fā)者提供更加可預測的開發(fā)環(huán)境。這杜絕了隱式的數(shù)據(jù)依賴導致的潛在。 關(guān)于Relay與GraphQL的介紹 原文:Introducing Relay and GraphQL 視頻地址(強烈建議觀看):https://www.y...</p> <div id="qoyqs8suu2u" class="com_white-left-info"> <div id="qoyqs8suu2u" class="com_white-left-infol"> <a href="http://systransis.cn/yun/u-1134.html"><img src="http://systransis.cn/yun/data/avatar/000/00/11/small_000001134.jpg" alt=""><span id="qoyqs8suu2u" class="layui-hide64">cncoder</span></a> <time datetime="">2019-08-21 10:26</time> <span><i class="fa fa-commenting"></i>評論0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div id="qoyqs8suu2u" class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="http://systransis.cn/yun/111422.html"><b>即將立秋的《課多周刊》(第2期)</b></a></h2> <p class="ellipsis2 good">摘要:即將立秋的課多周刊第期我們的微信公眾號,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動力。課多周刊機器人運營中心是如何玩轉(zhuǎn)起來的分享課多周刊是如何運營并堅持下來的。 即將立秋的《課多周刊》(第2期) 我們的微信公眾號:fed-talk,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大...</p> <div id="qoyqs8suu2u" class="com_white-left-info"> <div id="qoyqs8suu2u" class="com_white-left-infol"> <a href="http://systransis.cn/yun/u-1533.html"><img src="http://systransis.cn/yun/data/avatar/000/00/15/small_000001533.jpg" alt=""><span id="qoyqs8suu2u" class="layui-hide64">ruicbAndroid</span></a> <time datetime="">2019-08-29 11:06</time> <span><i class="fa fa-commenting"></i>評論0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div id="qoyqs8suu2u" class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="http://systransis.cn/yun/80060.html"><b>即將立秋的《課多周刊》(第2期)</b></a></h2> <p class="ellipsis2 good">摘要:即將立秋的課多周刊第期我們的微信公眾號,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動力。課多周刊機器人運營中心是如何玩轉(zhuǎn)起來的分享課多周刊是如何運營并堅持下來的。 即將立秋的《課多周刊》(第2期) 我們的微信公眾號:fed-talk,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大...</p> <div id="qoyqs8suu2u" class="com_white-left-info"> <div id="qoyqs8suu2u" class="com_white-left-infol"> <a href="http://systransis.cn/yun/u-1584.html"><img src="http://systransis.cn/yun/data/avatar/000/00/15/small_000001584.jpg" alt=""><span id="qoyqs8suu2u" class="layui-hide64">MRZYD</span></a> <time datetime="">2019-08-20 10:14</time> <span><i class="fa fa-commenting"></i>評論0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div id="qoyqs8suu2u" class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="http://systransis.cn/yun/79580.html"><b>[<em>譯</em>] 前端攻略-從路人甲到英雄無敵二:JavaScript 與不斷演化的框架</b></a></h2> <p class="ellipsis2 good">摘要:一般來說,聲明式編程關(guān)注于發(fā)生了啥,而命令式則同時關(guān)注與咋發(fā)生的。聲明式編程可以較好地解決這個問題,剛才提到的比較麻煩的元素選擇這個動作可以交托給框架或者庫區(qū)處理,這樣就能讓開發(fā)者專注于發(fā)生了啥,這里推薦一波與。 本文翻譯自FreeCodeCamp的from-zero-to-front-end-hero-part。 繼續(xù)譯者的廢話,這篇文章是前端攻略-從路人甲到英雄無敵的下半部分,在...</p> <div id="qoyqs8suu2u" class="com_white-left-info"> <div id="qoyqs8suu2u" class="com_white-left-infol"> <a href="http://systransis.cn/yun/u-1389.html"><img src="http://systransis.cn/yun/data/avatar/000/00/13/small_000001389.jpg" alt=""><span id="qoyqs8suu2u" class="layui-hide64">roadtogeek</span></a> <time datetime="">2019-08-19 18:25</time> <span><i class="fa fa-commenting"></i>評論0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> </ul> </div> <div id="qoyqs8suu2u" class="topicone-box-wangeditor"> <h3 class="top-com-title mb-64"><span>發(fā)表評論</span></h3> <div id="qoyqs8suu2u" class="xcp-publish-main flex_box_zd"> <div id="qoyqs8suu2u" class="unlogin-pinglun-box"> <a href="javascript:login()" class="grad">登陸后可評論</a> </div> </div> </div> <div id="qoyqs8suu2u" class="site-box-content"> <div id="qoyqs8suu2u" class="site-content-title"> <h3 class="top-com-title mb-64"><span>0條評論</span></h3> </div> <div id="qoyqs8suu2u" class="pages"></ul></div> </div> </div> <div id="qoyqs8suu2u" class="layui-col-md4 layui-col-lg3 com_white-right site-wrap-right"> <div id="qoyqs8suu2u" class=""> <div id="qoyqs8suu2u" class="com_layuiright-box user-msgbox"> <a href="http://systransis.cn/yun/u-687.html"><img src="http://systransis.cn/yun/data/avatar/000/00/06/small_000000687.jpg" alt=""></a> <h3><a href="http://systransis.cn/yun/u-687.html" rel="nofollow">mumumu</a></h3> <h6>男<span>|</span>高級講師</h6> <div id="qoyqs8suu2u" class="flex_box_zd user-msgbox-atten"> <a href="javascript:attentto_user(687)" id="attenttouser_687" class="grad follow-btn notfollow attention">我要關(guān)注</a> <a href="javascript:login()" title="發(fā)私信" >我要私信</a> </div> <div id="qoyqs8suu2u" class="user-msgbox-list flex_box_zd"> <h3 class="hpf">TA的文章</h3> <a href="http://systransis.cn/yun/ut-687.html" class="box_hxjz">閱讀更多</a> </div> <ul class="user-msgbox-ul"> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/122316.html">軟件測試就是簡單的點點點嗎???</a></h3> <p>閱讀 2079<span>·</span>2021-10-12 10:12</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/120914.html">??程序人生 | 為什么越來越多的人用Python來做自動化測試?</a></h3> <p>閱讀 797<span>·</span>2021-09-24 09:47</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/118309.html">CUBECLOUD:六周年慶鉅惠,洛杉磯VPS套餐年付五折,全場85折優(yōu)惠</a></h3> <p>閱讀 1198<span>·</span>2021-08-19 11:12</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/112373.html">Typecho 主題制作記錄</a></h3> <p>閱讀 3486<span>·</span>2019-08-29 13:06</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/107440.html">原生js實現(xiàn)省市區(qū)三級聯(lián)動插件</a></h3> <p>閱讀 695<span>·</span>2019-08-26 11:43</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/104182.html">2分鐘通過javascript的opener方式實現(xiàn)調(diào)用父窗口方法示例</a></h3> <p>閱讀 2581<span>·</span>2019-08-23 17:20</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/103429.html">ReactElement源碼解析</a></h3> <p>閱讀 1159<span>·</span>2019-08-23 16:52</p></li> <li><h3 class="ellipsis"><a href="http://systransis.cn/yun/100641.html">放棄jQuery, 使用原生js</a></h3> <p>閱讀 2607<span>·</span>2019-08-23 14:27</p></li> </ul> </div> <!-- 文章詳情右側(cè)廣告--> <div id="qoyqs8suu2u" class="com_layuiright-box"> <h6 class="top-com-title"><span>最新活動</span></h6> <div id="qoyqs8suu2u" class="com_adbox"> <div id="qoyqs8suu2u" class="layui-carousel" id="right-item"> <div carousel-item> <div> <a href="http://systransis.cn/site/active/kuaijiesale.html?ytag=seo" rel="nofollow"> <img src="http://systransis.cn/yun/data/attach/240625/2rTjEHmi.png" alt="云服務(wù)器"> </a> </div> <div> <a href="http://systransis.cn/site/product/gpu.html" rel="nofollow"> <img src="http://systransis.cn/yun/data/attach/240807/7NjZjdrd.png" alt="GPU云服務(wù)器"> </a> </div> </div> </div> </div> <!-- banner結(jié)束 --> <div id="qoyqs8suu2u" class="adhtml"> </div> <script> $(function(){ $.ajax({ type: "GET", url:"http://systransis.cn/yun/ad/getad/1.html", cache: false, success: function(text){ $(".adhtml").html(text); } }); }) </script> </div> </div> </div> </div> </div> </section> <!-- wap拉出按鈕 --> <div id="qoyqs8suu2u" class="site-tree-mobile layui-hide"> <i class="layui-icon layui-icon-spread-left"></i> </div> <!-- wap遮罩層 --> <div id="qoyqs8suu2u" class="site-mobile-shade"></div> <!--付費閱讀 --> <div class="qoyqs8suu2u" id="payread"> <div id="qoyqs8suu2u" class="layui-form-item">閱讀需要支付1元查看</div> <div id="qoyqs8suu2u" class="layui-form-item"><button class="btn-right">支付并查看</button></div> </div> <script> var prei=0; $(".site-seo-depict pre").each(function(){ var html=$(this).html().replace("<code>","").replace("</code>","").replace('<code class="javascript hljs" codemark="1">',''); $(this).attr('data-clipboard-text',html).attr("id","pre"+prei); $(this).html("").append("<code>"+html+"</code>"); prei++; }) $(".site-seo-depict img").each(function(){ if($(this).attr("src").indexOf('data:image/svg+xml')!= -1){ $(this).remove(); } }) $("LINK[href*='style-49037e4d27.css']").remove(); $("LINK[href*='markdown_views-d7a94ec6ab.css']").remove(); layui.use(['jquery', 'layer','code'], function(){ $("pre").attr("class","layui-code"); $("pre").attr("lay-title",""); $("pre").attr("lay-skin",""); layui.code(); $(".layui-code-h3 a").attr("class","copycode").html("復制代碼 ").attr("onclick","copycode(this)"); }); function copycode(target){ var id=$(target).parent().parent().attr("id"); var clipboard = new ClipboardJS("#"+id); clipboard.on('success', function(e) { e.clearSelection(); alert("復制成功") }); clipboard.on('error', function(e) { alert("復制失敗") }); } //$(".site-seo-depict").html($(".site-seo-depict").html().slice(0, -5)); </script> <link rel="stylesheet" type="text/css" href="http://systransis.cn/yun/static/js/neweditor/code/styles/tomorrow-night-eighties.css"> <script src="http://systransis.cn/yun/static/js/neweditor/code/highlight.pack.js" type="text/javascript"></script> <script src="http://systransis.cn/yun/static/js/clipboard.js"></script> <script>hljs.initHighlightingOnLoad();</script> <script> function setcode(){ var _html=''; document.querySelectorAll('pre code').forEach((block) => { var _tmptext=$.trim($(block).text()); if(_tmptext!=''){ _html=_html+_tmptext; console.log(_html); } }); } </script> <script> function payread(){ layer.open({ type: 1, title:"付費閱讀", shadeClose: true, content: $('#payread') }); } // 舉報 function jupao_tip(){ layer.open({ type: 1, title:false, shadeClose: true, content: $('#jubao') }); } $(".getcommentlist").click(function(){ var _id=$(this).attr("dataid"); var _tid=$(this).attr("datatid"); $("#articlecommentlist"+_id).toggleClass("hide"); var flag=$("#articlecommentlist"+_id).attr("dataflag"); if(flag==1){ flag=0; }else{ flag=1; //加載評論 loadarticlecommentlist(_id,_tid); } $("#articlecommentlist"+_id).attr("dataflag",flag); }) $(".add-comment-btn").click(function(){ var _id=$(this).attr("dataid"); $(".formcomment"+_id).toggleClass("hide"); }) $(".btn-sendartcomment").click(function(){ var _aid=$(this).attr("dataid"); var _tid=$(this).attr("datatid"); var _content=$.trim($(".commenttext"+_aid).val()); if(_content==''){ alert("評論內(nèi)容不能為空"); return false; } var touid=$("#btnsendcomment"+_aid).attr("touid"); if(touid==null){ touid=0; } addarticlecomment(_tid,_aid,_content,touid); }) $(".button_agree").click(function(){ var supportobj = $(this); var tid = $(this).attr("id"); $.ajax({ type: "GET", url:"http://systransis.cn/yun/index.php?topic/ajaxhassupport/" + tid, cache: false, success: function(hassupport){ if (hassupport != '1'){ $.ajax({ type: "GET", cache:false, url: "http://systransis.cn/yun/index.php?topic/ajaxaddsupport/" + tid, success: function(comments) { supportobj.find("span").html(comments+"人贊"); } }); }else{ alert("您已經(jīng)贊過"); } } }); }); function attenquestion(_tid,_rs){ $.ajax({ //提交數(shù)據(jù)的類型 POST GET type:"POST", //提交的網(wǎng)址 url:"http://systransis.cn/yun/favorite/topicadd.html", //提交的數(shù)據(jù) data:{tid:_tid,rs:_rs}, //返回數(shù)據(jù)的格式 datatype: "json",//"xml", "html", "script", "json", "jsonp", "text". //在請求之前調(diào)用的函數(shù) beforeSend:function(){}, //成功返回之后調(diào)用的函數(shù) success:function(data){ var data=eval("("+data+")"); console.log(data) if(data.code==2000){ layer.msg(data.msg,function(){ if(data.rs==1){ //取消收藏 $(".layui-layer-tips").attr("data-tips","收藏文章"); $(".layui-layer-tips").html('<i class="fa fa-heart-o"></i>'); } if(data.rs==0){ //收藏成功 $(".layui-layer-tips").attr("data-tips","已收藏文章"); $(".layui-layer-tips").html('<i class="fa fa-heart"></i>') } }) }else{ layer.msg(data.msg) } } , //調(diào)用執(zhí)行后調(diào)用的函數(shù) complete: function(XMLHttpRequest, textStatus){ postadopt=true; }, //調(diào)用出錯執(zhí)行的函數(shù) error: function(){ //請求出錯處理 postadopt=false; } }); } </script> <footer> <div id="qoyqs8suu2u" class="layui-container"> <div id="qoyqs8suu2u" class="flex_box_zd"> <div id="qoyqs8suu2u" class="left-footer"> <h6><a href="http://systransis.cn/"><img src="http://systransis.cn/yun/static/theme/ukd//images/logo.png" alt="UCloud (優(yōu)刻得科技股份有限公司)"></a></h6> <p>UCloud (優(yōu)刻得科技股份有限公司)是中立、安全的云計算服務(wù)平臺,堅持中立,不涉足客戶業(yè)務(wù)領(lǐng)域。公司自主研發(fā)IaaS、PaaS、大數(shù)據(jù)流通平臺、AI服務(wù)平臺等一系列云計算產(chǎn)品,并深入了解互聯(lián)網(wǎng)、傳統(tǒng)企業(yè)在不同場景下的業(yè)務(wù)需求,提供公有云、混合云、私有云、專有云在內(nèi)的綜合性行業(yè)解決方案。</p> </div> <div id="qoyqs8suu2u" class="right-footer layui-hidemd"> <ul class="flex_box_zd"> <li> <h6>UCloud與云服務(wù)</h6> <p><a href="http://systransis.cn/site/about/intro/">公司介紹</a></p> <p><a >加入我們</a></p> <p><a href="http://systransis.cn/site/ucan/onlineclass/">UCan線上公開課</a></p> <p><a href="http://systransis.cn/site/solutions.html" >行業(yè)解決方案</a></p> <p><a href="http://systransis.cn/site/pro-notice/">產(chǎn)品動態(tài)</a></p> </li> <li> <h6>友情鏈接</h6> <p><a >GPU算力平臺</a></p> <p><a >UCloud私有云</a></p> <p><a >SurferCloud</a></p> <p><a >工廠仿真軟件</a></p> <p><a >Pinex</a></p> <p><a >AI繪畫</a></p> </li> <li> <h6>社區(qū)欄目</h6> <p><a href="http://systransis.cn/yun/column/index.html">專欄文章</a></p> <p><a href="http://systransis.cn/yun/udata/">專題地圖</a></p> </li> <li> <h6>常見問題</h6> <p><a href="http://systransis.cn/site/ucsafe/notice.html" >安全中心</a></p> <p><a href="http://systransis.cn/site/about/news/recent/" >新聞動態(tài)</a></p> <p><a href="http://systransis.cn/site/about/news/report/">媒體動態(tài)</a></p> <p><a href="http://systransis.cn/site/cases.html">客戶案例</a></p> <p><a href="http://systransis.cn/site/notice/">公告</a></p> </li> <li> <span><img src="https://static.ucloud.cn/7a4b6983f4b94bcb97380adc5d073865.png" alt="優(yōu)刻得"></span> <p>掃掃了解更多</p></div> </div> <div id="qoyqs8suu2u" class="copyright">Copyright ? 2012-2023 UCloud 優(yōu)刻得科技股份有限公司<i>|</i><a rel="nofollow" >滬公網(wǎng)安備 31011002000058號</a><i>|</i><a rel="nofollow" ></a> 滬ICP備12020087號-3</a><i>|</i> <script type="text/javascript" src="https://gyfk12.kuaishang.cn/bs/ks.j?cI=197688&fI=125915" charset="utf-8"></script> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://#/hm.js?290c2650b305fc9fff0dbdcafe48b59d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-DZSMXQ3P9N"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-DZSMXQ3P9N'); </script> <script> (function(){ var el = document.createElement("script"); el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?99f50ea166557aed914eb4a66a7a70a4709cbb98a54ecb576877d99556fb4bfc3d72cd14f8a76432df3935ab77ec54f830517b3cb210f7fd334f50ccb772134a"; el.id = "ttzz"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(el, s); })(window) </script></div> </div> </footer> <footer> <div class="friendship-link"> <p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p> <a href="http://systransis.cn/" title="成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费">成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费</a> <div class="friend-links"> </div> </div> </footer> <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body><div id="fnnvt" class="pl_css_ganrao" style="display: none;"><legend id="fnnvt"><span id="fnnvt"><nobr id="fnnvt"><div id="fnnvt"></div></nobr></span></legend><dl id="fnnvt"></dl><strong id="fnnvt"><meter id="fnnvt"><label id="fnnvt"><acronym id="fnnvt"></acronym></label></meter></strong><dfn id="fnnvt"><sup id="fnnvt"></sup></dfn><form id="fnnvt"></form><label id="fnnvt"></label><label id="fnnvt"><menuitem id="fnnvt"></menuitem></label><address id="fnnvt"><meter id="fnnvt"><form id="fnnvt"><label id="fnnvt"></label></form></meter></address><mark id="fnnvt"><optgroup id="fnnvt"></optgroup></mark><i id="fnnvt"></i><div id="fnnvt"></div><meter id="fnnvt"><form id="fnnvt"><dl id="fnnvt"><menuitem id="fnnvt"></menuitem></dl></form></meter><th id="fnnvt"><thead id="fnnvt"><font id="fnnvt"><sup id="fnnvt"></sup></font></thead></th><address id="fnnvt"></address><strong id="fnnvt"><div id="fnnvt"></div></strong><ins id="fnnvt"><pre id="fnnvt"></pre></ins><var id="fnnvt"><mark id="fnnvt"><pre id="fnnvt"><tt id="fnnvt"></tt></pre></mark></var><dfn id="fnnvt"><thead id="fnnvt"><small id="fnnvt"><dfn id="fnnvt"></dfn></small></thead></dfn><small id="fnnvt"><pre id="fnnvt"><ins id="fnnvt"><legend id="fnnvt"></legend></ins></pre></small><b id="fnnvt"><listing id="fnnvt"><div id="fnnvt"><u id="fnnvt"></u></div></listing></b><rp id="fnnvt"></rp><menuitem id="fnnvt"><form id="fnnvt"></form></menuitem><rp id="fnnvt"><p id="fnnvt"></p></rp><span id="fnnvt"><video id="fnnvt"><legend id="fnnvt"><thead id="fnnvt"></thead></legend></video></span><video id="fnnvt"></video><form id="fnnvt"><dl id="fnnvt"><ruby id="fnnvt"><strike id="fnnvt"></strike></ruby></dl></form><pre id="fnnvt"></pre><sup id="fnnvt"><progress id="fnnvt"><optgroup id="fnnvt"><span id="fnnvt"></span></optgroup></progress></sup><acronym id="fnnvt"></acronym><big id="fnnvt"><dfn id="fnnvt"><ol id="fnnvt"><ins id="fnnvt"></ins></ol></dfn></big><output id="fnnvt"><style id="fnnvt"><acronym id="fnnvt"><ruby id="fnnvt"></ruby></acronym></style></output><font id="fnnvt"></font><sup id="fnnvt"><progress id="fnnvt"></progress></sup><output id="fnnvt"><b id="fnnvt"><nobr id="fnnvt"><p id="fnnvt"></p></nobr></b></output><acronym id="fnnvt"></acronym><big id="fnnvt"></big><ins id="fnnvt"></ins><track id="fnnvt"></track><u id="fnnvt"><strong id="fnnvt"></strong></u><legend id="fnnvt"><b id="fnnvt"></b></legend><div id="fnnvt"></div><optgroup id="fnnvt"><sup id="fnnvt"></sup></optgroup><output id="fnnvt"><style id="fnnvt"><form id="fnnvt"><track id="fnnvt"></track></form></style></output><form id="fnnvt"></form><dfn id="fnnvt"><var id="fnnvt"></var></dfn><sub id="fnnvt"></sub><nobr id="fnnvt"><p id="fnnvt"><b id="fnnvt"><strong id="fnnvt"></strong></b></p></nobr><sub id="fnnvt"><nobr id="fnnvt"><p id="fnnvt"><u id="fnnvt"></u></p></nobr></sub><dfn id="fnnvt"><big id="fnnvt"><small id="fnnvt"><ol id="fnnvt"></ol></small></big></dfn><legend id="fnnvt"><b id="fnnvt"><label id="fnnvt"><menuitem id="fnnvt"></menuitem></label></b></legend><ruby id="fnnvt"><i id="fnnvt"><font id="fnnvt"><th id="fnnvt"></th></font></i></ruby><label id="fnnvt"></label><dfn id="fnnvt"><thead id="fnnvt"></thead></dfn><dl id="fnnvt"><meter id="fnnvt"><label id="fnnvt"><acronym id="fnnvt"></acronym></label></meter></dl><rp id="fnnvt"></rp><label id="fnnvt"><acronym id="fnnvt"></acronym></label><em id="fnnvt"></em><optgroup id="fnnvt"><span id="fnnvt"></span></optgroup><label id="fnnvt"><meter id="fnnvt"></meter></label><output id="fnnvt"></output><u id="fnnvt"></u><u id="fnnvt"></u><acronym id="fnnvt"><ruby id="fnnvt"><i id="fnnvt"><address id="fnnvt"></address></i></ruby></acronym><tt id="fnnvt"><strong id="fnnvt"></strong></tt><output id="fnnvt"></output><acronym id="fnnvt"><output id="fnnvt"><label id="fnnvt"><acronym id="fnnvt"></acronym></label></output></acronym><ruby id="fnnvt"><i id="fnnvt"><address id="fnnvt"><dfn id="fnnvt"></dfn></address></i></ruby><sub id="fnnvt"></sub><pre id="fnnvt"><span id="fnnvt"><rp id="fnnvt"><p id="fnnvt"></p></rp></span></pre><thead id="fnnvt"><listing id="fnnvt"><div id="fnnvt"><form id="fnnvt"></form></div></listing></thead><thead id="fnnvt"><small id="fnnvt"></small></thead><thead id="fnnvt"></thead><listing id="fnnvt"><legend id="fnnvt"><sub id="fnnvt"><nobr id="fnnvt"></nobr></sub></legend></listing><p id="fnnvt"></p><style id="fnnvt"><form id="fnnvt"><track id="fnnvt"><strike id="fnnvt"></strike></track></form></style><ins id="fnnvt"><optgroup id="fnnvt"><sub id="fnnvt"><video id="fnnvt"></video></sub></optgroup></ins><form id="fnnvt"><ruby id="fnnvt"><i id="fnnvt"><font id="fnnvt"></font></i></ruby></form><form id="fnnvt"></form><big id="fnnvt"><dfn id="fnnvt"><var id="fnnvt"><progress id="fnnvt"></progress></var></dfn></big><ruby id="fnnvt"><label id="fnnvt"></label></ruby><var id="fnnvt"><progress id="fnnvt"></progress></var><meter id="fnnvt"></meter><u id="fnnvt"><form id="fnnvt"><track id="fnnvt"><style id="fnnvt"></style></track></form></u><em id="fnnvt"><var id="fnnvt"><mark id="fnnvt"><strong id="fnnvt"></strong></mark></var></em><dl id="fnnvt"><output id="fnnvt"></output></dl><p id="fnnvt"></p><div id="fnnvt"></div><dl id="fnnvt"><output id="fnnvt"></output></dl><acronym id="fnnvt"></acronym><thead id="fnnvt"><listing id="fnnvt"><legend id="fnnvt"><b id="fnnvt"></b></legend></listing></thead><optgroup id="fnnvt"><sub id="fnnvt"><nobr id="fnnvt"><p id="fnnvt"></p></nobr></sub></optgroup><style id="fnnvt"><font id="fnnvt"></font></style><form id="fnnvt"></form><sup id="fnnvt"><big id="fnnvt"><dfn id="fnnvt"><span id="fnnvt"></span></dfn></big></sup><form id="fnnvt"><acronym id="fnnvt"><output id="fnnvt"><i id="fnnvt"></i></output></acronym></form><sub id="fnnvt"><rp id="fnnvt"><strong id="fnnvt"><sub id="fnnvt"></sub></strong></rp></sub><legend id="fnnvt"><tt id="fnnvt"><listing id="fnnvt"><meter id="fnnvt"></meter></listing></tt></legend><big id="fnnvt"><dfn id="fnnvt"></dfn></big><div id="fnnvt"></div><pre id="fnnvt"><sub id="fnnvt"><rp id="fnnvt"><legend id="fnnvt"></legend></rp></sub></pre></div> <script src="http://systransis.cn/yun/static/theme/ukd/js/common.js"></script> <<script type="text/javascript"> $(".site-seo-depict *,.site-content-answer-body *,.site-body-depict *").css("max-width","100%"); </script> </html>