首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React + MaterialUi在IconMenu和ListItem中的处理操作

React + MaterialUi在IconMenu和ListItem中的处理操作
EN

Stack Overflow用户
提问于 2017-01-01 13:25:41
回答 2查看 1.3K关注 0票数 0

我正在学习react,我尝试基于material创建简单的TODO,我在处理IconMenu菜单操作时遇到了问题,菜单显示在listItem元素中。此时,我不知道在菜单中单击delete操作时如何触发以项目名称作为参数的deleteItem函数。

代码语言:javascript
复制
const iconButtonElement = (
    <IconButton touch={true} tooltip="More" tooltipPosition="bottom-left">
        <MoreVertIcon color="black"/>
    </IconButton>
);

const rightIconMenu = (
    <IconMenu iconButtonElement={iconButtonElement}>
        <MenuItem value="done" leftIcon={<Done />}>Mark as done</MenuItem>
        <MenuItem value="delete" leftIcon={<Delete />}>Delete</MenuItem>
    </IconMenu>
);

class TodoElements extends Component {
    deleteItem(nameProp)
    {
        this.props.delete(nameProp);
    }
    render() {
        var listItemRender = function(item) {
            return <ListItem key={item.name} primaryText={item.name} style={listItemStyle} rightIconButton={rightIconMenu}/>
        };
        listItemRender = listItemRender.bind(this);
        return (
            <List>
                {this.props.items.map(listItemRender)}
            </List>
        )
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-01 16:28:17

据我所见,您应该能够将onChange处理程序添加到IconMenu中。所以您的rightIconMenu可以如下所示:

代码语言:javascript
复制
const RightIconMenu = ({onChange}) => (
    <IconMenu iconButtonElement={iconButtonElement} onChange={onChange}>
        <MenuItem value="done" leftIcon={<Done />}>Mark as done</MenuItem>
        <MenuItem value="delete" leftIcon={<Delete />}>Delete</MenuItem>
    </IconMenu>
);

然后,您可以像这样在TodoElements中使用它:

代码语言:javascript
复制
class TodoElements extends Component {
    constructor(props){
        super(props);

        this.state = {
            items: props.items
        };
    }

    createChangeHandler = (nameProp) => {
        return (event, value) => {
            if(value==="delete"){
                this.deleteItem(nameProp);
            }
        };
    }

    deleteItem = (nameProp) =>
    {
        this.setState({ 
            items: this.state.items.filter((item) => {
                return item.name !== nameProp);
            })
        });
    }

    render() {
        return (
            <List>
            {this.state.items.map((item) => {
                <ListItem key={item.name} primaryText={item.name} style={listItemStyle} 
                    rightIconButton={<RightIconMenu onChange={this.createChangeHandler(item.name)} />}/>
            })}
            </List>
        )
    }
}

替代

作为另一种解决方案,您可以将onClick处理程序绑定到删除MenuItem。我可能会这样实施:

代码语言:javascript
复制
const RightIconMenu = ({onDelete}) => (
    <IconMenu iconButtonElement={iconButtonElement}>
        <MenuItem value="done" leftIcon={<Done />}>Mark as done</MenuItem>
        <MenuItem value="delete" leftIcon={<Delete />} onClick={onDelete}>Delete</MenuItem>
    </IconMenu>
);

然后替换TodoElements中的适当函数:

代码语言:javascript
复制
createChangeHandler = (nameProp) => {
    return (event, value) => {
        this.deleteItem(nameProp);
    };
}
render() {
    return (
        <List>
        {this.state.items.map((item) => {
            <ListItem key={item.name} primaryText={item.name} style={listItemStyle} 
                rightIconButton={<RightIconMenu onDelete={this.createDeleteHandler(item.name)} />}/>
        })}
        </List>
    )
}

至于处理项列表的状态,您可能应该查看全局状态管理(如Redux )。

票数 1
EN

Stack Overflow用户

发布于 2017-01-03 09:39:08

我认为更好的方法是使用每个onTouchTap都有的MenuItem,这样onChange函数就不会有一个开关或许多if语句。实际上,当我遍历所有菜单项时,我都在使用它,在我看来,它是这样的:

代码语言:javascript
复制
                        _.map(menuItems, (currItem, index) => {
                        return (<MenuItem primaryText={currItem.primaryText}
                                          rightIcon={currItem.rightIcon}
                                          leftIcon={currItem.leftIcon}
                                          key={`menu-item-${index}`}
                                          value={currItem.value}}
                                          onTouchTap={currItem.onTouchTap}/>)
                    })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41415802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档