代码之家  ›  专栏  ›  技术社区  ›  turkeyman84

我必须在Blueprint.js中使用带有MultiSelect(labs)组件的TypeScript吗

  •  2
  • turkeyman84  · 技术社区  · 9 年前

    我正忙于试验蓝图。js和MultiSelect组件,我知道它仍在积极开发中: http://blueprintjs.com/docs/#labs.multiselect

    我从未使用过TypeScript,据说

    // Select<T> is a generic component to work with your data types.
    // In TypeScript, you must first obtain a non-generic reference:
    const FilmSelect = Select.ofType<Film>();
    

    是否可以在Javascript中使用此组件而不使用TypeScript?

    我的react组件目前未渲染,出现以下错误:

    multiSelect.js?64c9:37 Uncaught TypeError: Cannot read property 'map' of undefined
    

    import React from 'react';
    import Flexbox from 'flexbox-react';
    import {Dialog, Button, Intent} from '@blueprintjs/core';
    import {MultiSelect} from '@blueprintjs/labs';
    import {inject, observer} from 'mobx-react';
    import Avatar from 'react-avatar';
    
    @inject('AccountRelationshipsStore', 'AccountUsersStore', 'ToastStore')@observer
    export default class AccountRelationshipsNewRelationship extends React.Component {
    constructor(props) {
        super(props);
    
        this.state = ({isSubmitting: false});
    }
    
    renderUser(handleClick, isActive, user) {
        return (
            <span>{user.fullName}</span>
        );
    }
    
    renderTag(user) {
        return user.fullName;
    }
    
    handleItemSelect(item) {
        console.log(item);
    }
    
    render() {
        return (
            <Dialog isOpen={this.props.dialogOpen} onClose={() => this.props.toggleDialog()} canOutsideClickClose={true} title={I18n.t('js.add_a_new_user_relationship', {
                type: this.props.AccountRelationshipsStore.activeRelationship.name.toLowerCase(),
                name: this.props.AccountRelationshipsStore.activeUser.fullName
            })} className='side-dialog' inline={true}>
                <form>
                    <div className='pt-dialog-body'>
                        <Flexbox flexDirection='column' flexGrow={1}>
                            <Flexbox flexDirection='row' justifyContent='center' flexGrow={1}>
                                <Avatar src={this.props.AccountRelationshipsStore.activeUser.imageFileName} size={100} round={true} className=''/>
                            </Flexbox>
                            <Flexbox flexDirection='row' justifyContent='center' flexGrow={1} marginTop='10px'>
                                <p className='pt-text-muted'>{this.props.AccountRelationshipsStore.activeUser.fullName}</p>
                            </Flexbox>
                            <Flexbox>
                                <MultiSelect items={this.props.AccountUsersStore.users} itemRenderer={this.renderUser.bind(this)} onItemSelect={this.handleItemSelect.bind(this)} tagRenderer={this.renderTag.bind(this)}/>
                            </Flexbox>
                        </Flexbox>
                    </div>
                    <div className='pt-dialog-footer pt-dialog-footer-bottom'>
                        <div className='pt-dialog-footer-actions'>
                            <Button text={I18n.t('js.cancel')} onClick={() => this.props.toggleDialog()}/>
                            <Button intent={Intent.PRIMARY} type='submit' text={I18n.t('js.set_relationships')} loading={this.state.isSubmitting}/>
                        </div>
                    </div>
                </form>
            </Dialog>
        );
      }
    }
    
    1 回复  |  直到 9 年前
        1
  •  5
  •   Adi Dahiya    9 年前

    是的,您可以将组件与JS一起使用。只需省略泛型类型param:

    const UserMultiSelect = MultiSelect.ofType();
    
    <UserMultiSelect items={this.props.AccountUsersStore.users} ... />