轉帖|其它|編輯:陳津勇|2019-09-25 09:42:47.970|閱讀 244 次
概述:在V2019.0 Update2 的全新版本中,React框架下WijmoJS的前端UI組件功能再度增強。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
WijmoJS的菜單和類似列表的控件(ListBox、ComboBox、MultiSelect)允許用戶在formatItem事件中使用JS代碼和DOM API為每個項目生成元素樹,從而自定制項目的內容。在和React框架深度結合后,在JSX標記中使用React組件及其屬性綁定將會更加方便,即以聲明方式定義項目內容。
在WijmoJS的新版本中,GrapeCity為WijmoJS React Interop添加了兩個特殊的功能項:
對于 Menu,添加了MenuItem和MenuSeparator子組件,它允許您在JSX中以聲明方式定義菜單項和分隔符。
對于所有類似列表的控件(ListBox、ComboBox、MultiSelect、Menu),添加了特殊的wjItemTemplate渲染道具,它允許您指定繪制項目內容的渲染函數。
React 菜單項(List Items)
純javascript菜單控件假定其菜單項是在綁定到控件項源屬性的數組中定義的,即項目在React組件的模型部分中定義。但這并不是最佳選項,實際上菜單項與組件的UI關系更為緊密,因此,使用React UI方法(即JSX標記)定義它們會更方便。
使用WijmoJS,您可以通過\@ grapecity/wijmo.react.input模塊中的新MenuItem組件快速實現菜單項目定義:在渲染函數的JSX標記中使用嵌套到其Menu部分的MenuItem組件,而不是在數組中定義項目,其中每個MenuItem定義一個單獨的菜單項,其內容具有任意復雜性。
此外,使用MenuSeparator組件還可用于在菜單項之間插入分隔符。例如,此示例中的以下jsx代碼定義了具有豐富內容的菜單項目,并在退出項之前使用分隔符:
<wjInput.Menu
    header="File"
    itemClicked={this.menuItemClicked}>
    <wjInput.MenuItem>
        <span className="glyphicon glyphicon-asterisk"></span>
        <b>New</b>
        <br />
        <small><i>create a new file</i></small>
    </wjInput.MenuItem>
    <wjInput.MenuItem>
        <span className="glyphicon glyphicon-folder-open"></span>
        <b>Open</b>
        <br />
        <small><i>open an existing file or folder</i></small>
    </wjInput.MenuItem>
    <wjInput.MenuItem>
        <span className="glyphicon glyphicon-floppy-disk"></span>
        <b>Save</b>
        <br />
        <small><i>save the current file</i></small>
    </wjInput.MenuItem>
    <wjInput.MenuSeparator></wjInput.MenuSeparator>
    <wjInput.MenuItem>
        <span className="glyphicon glyphicon-remove"></span>
        <b>Exit</b>
        <br />
        <small><i>exit the application</i></small>
    </wjInput.MenuItem>
</wjInput.Menu>您還可以從定義其數據的數據源中,動態生成多個MenuItem。
例如下方代碼實現了:調色板數組映射到表示其數據的MenuItem數組中:
<wjInput.Menu
    header="Palette"
    maxDropDownHeight={300}
    value={this.state.thePalette}>
    {this.palettes.map((value) => {
        return <wjInput.MenuItem value={value.name}>
            {value.name}
            <span style={{float:'right'}}>
            {value.colors.map((color) => {
                return <div style={{
                    backgroundColor: color,
                    display:'inline',
                    padding:'2px',
                    height:'10px',
                    width:'3px'}}>
                </div>
            })}
            </span>
        </wjInput.MenuItem>
    })}
</wjInput.Menu>請注意,此處的Menu組件未使用其itemsSource屬性綁定數據數組。相反,它直接從數據數組中生成子MenuItem組件。
命令(Commands)
您現在可以用聲明的方式,定義綁定帶參數/命令的菜單項。MenuItem組件從其接口中公開了cmd和cmdParam屬性,這些屬性可以分別綁定命令及其參數。
下面的代碼示例演示了:如何使用這些屬性來定義遞增或遞減的菜單項。其中,每個項目表示作為命令參數指定的不同增量值:
<wjInput.Menu
    header="Tax Commands"
    id="changeTax"
    command={this.state.command}>
    <wjInput.MenuItem cmd={this.state.command} cmdParam={0.50}>
        Increment by 50%
    </wjInput.MenuItem>
    <wjInput.MenuItem cmd={this.state.command} cmdParam={0.25}>
        Increment by 25%
    </wjInput.MenuItem>
    <wjInput.MenuItem cmd={this.state.command} cmdParam={0.05}>
        Increment by 5%
    </wjInput.MenuItem>
    <wjInput.MenuSeparator></wjInput.MenuSeparator>
    <wjInput.MenuItem cmd={this.state.command} cmdParam={-0.05}>
        Decrement by 5%
    </wjInput.MenuItem>
    <wjInput.MenuItem cmd={this.state.command} cmdParam={-0.25}>
        Decrement by 25%
    </wjInput.MenuItem>
    <wjInput.MenuItem cmd={this.state.command} cmdParam={-0.50}>
        Decrement by 50%
    </wjInput.MenuItem>
</wjInput.Menu>值選擇器(Value Picker)
隨著MenuItem組件的引入,Menu現在可以用作值選擇器。MenuItem組件的value屬性包含了與該項關聯的值。點擊下載WijmoJS正式版
WijmoJS的菜單本身就具有value屬性,其值顯示在菜單標題旁邊,其屬性可以綁定到父組件狀態,而其中的itemClicked事件可用于更新與所選菜單項關聯值的狀態。此示例演示了可用于選擇瀏覽器名稱的菜單:
render() {
    return <wjInput.Menu
            header="Run"
            value={this.state.browser}
            itemClicked={this.splitButtonItemClicked}>
        <wjInput.MenuItem value="IE">Internet Explorer</wjInput.MenuItem>
        <wjInput.MenuItem value="Chrome">Chrome</wjInput.MenuItem>
        <wjInput.MenuItem value="FF">FireFox</wjInput.MenuItem>
        <wjInput.MenuItem value="Safari">Safari</wjInput.MenuItem>
        <wjInput.MenuItem value="Opera">Opera</wjInput.MenuItem>
    </wjInput.Menu>
}
splitButtonItemClicked = (menu) => {
    this.setState({
        browser: menu.selectedItem.value
    });
};項目模板(Item Templates)
您可以使用formatItem事件為純JS的列表類控件創建自定義項目內容,如ListBox、ComboBox、MultiSelect和Menu。相應的React組件允許您使用JSX標記以聲明方式定義項目內容。
此外,對于每個提到的組件,WijmoJS都會公開一個名為“wjItemTemplate”的渲染道具,它允許您指定繪制項目內容的渲染函數。例如,此示例演示了:通過標記繪制了一個字形,其名稱取自源數組:
<wjInput.ListBox
    displayMemberPath="country"
    itemsSource={this.state.glyphs}
    selectedIndexChanged={this.onSelectedIndexChanged}
    initialized={this.onInitialized}
    wjItemTemplate={(context: wjInput.ItemTemplateContext)=>(
        <div>
            <div className="wj-glyph">
                <span className={`wj-glyph-${context.item}`}></span>
            </div>
            {context.item}
        </div>
    )}>
</wjInput.ListBox>注意,wjItemTemplate渲染函數提供了一個上下文參數,該參數用以帶來有關當前繪圖項的信息對象,它公開了以下屬性:
item - 正在呈現其內容的數據項
itemIndex - 要呈現的項的索引
control - 由React組件表示的底層純JS控件
MultiSelect 組件
MultiSelect組件與其他類似列表的控件相比具備一個顯著特征:其每個項目都包含了一個復選框,用于更改項目的已檢查狀態。
在使用項目模板進行項目自定義時,此功能也可以保留。與往常一樣,項目模板中type =“checkbox”的第一個輸入元素將用作檢查狀態開關。
此示例中的代碼定義了包含此類復選框的項目模板:
<wjInput.MultiSelect
    displayMemberPath="name"
    headerPath="name"
    placeholder="Countries"
    itemsSource={this.state.data}
    showSelectAllCheckbox={this.state.showSelectAllCheckbox}
    checkedItemsChanged={this._onCheckedItemsChanged.bind(this)}
    wjItemTemplate={(context: wjInput.ItemTemplateContext)=>(
        <div className="item">
            <label><input type="checkbox"/>{context.item.name}</label>
            <br/>
            <b>{context.item.city}</b> ({context.item.state})<br/>
            {context.item.address}<br/>
            Phone: <b>{context.item.phone}</b><br/>
            Fax: <b>{context.item.fax}</b><br/>
            Website: <a href="{context.item.site}" target="_blank">{context.item.site}</a><br/>
        </div>
    )}>
</wjInput.MultiSelect>菜單(Menu)
在上面的介紹中,我們已經向您演示了如何從一組數據項,動態創建MenuItem組件。下面將介紹的wjitemTemplate渲染屬性是實現此類功能的另一種方法。
使用此方法,Menu組件應該綁定到一個項目數組中,而wjItemTemplate render prop定義一個用于呈現每個項目的模板。
例如,此示例中的代碼片段顯示綁定到音樂家數組的菜單的自定義項:
header="Artists"
    itemClicked={this.menuItemClicked}
    itemsSource={this.musicians}
    maxDropDownHeight={300}
    wjItemTemplate={(context: wjInput.ItemTemplateContext)=>(
        <div style={{minWidth: '160px'}}>
            {context.itemIndex + 1}. <b>{context.item.name}</b>
            {context.item.photo ?
            <div>
                <img src={context.item.photo} height="50" />
            </div>
            : null}
        </div>
    )}>
</wjInput.Menu>結論
WijmoJS全新的MenuItem組件和wjItemTemplate渲染道具,全面提升了WijmoJS列表類組件的自定義擴展能力和便捷性。
毫不夸張的說,使用WijmoJS前端開發工具包,您現在可以通過傳統的JSX標記,綁定帶有其他應用程序組件的豐富項目,并定義其內容。
想要獲得 WijimoJS 更多資源或正版授權的伙伴,
掃描關注慧聚IT微信公眾號,及時獲取最新動態及最新資訊

本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自: