【问题标题】:Uncaught TypeError: .includes is not a function with React Ref未捕获的 TypeError:.includes 不是 React Ref 的函数
【发布时间】:2018-11-01 21:50:55
【问题描述】:

我正在尝试制作一个菜单,当它被点击时它会显示出来。这工作正常。但是,我希望在选择原始菜单或项目列表之外的任何内容时关闭菜单。但是,当我这样做时,它会返回错误

Uncaught TypeError: _this.dropdownMenu.includes is not a function
    at HTMLDocument.eval (FeedItem.jsx:277)

视觉

代码

import React, { Component } from 'react'
import styled from 'styled-components';

const OptionMenu = styled.div `
    position: absolute;
    top: 20px;
    left: -130px;
    display: ${props => props.showMenu ? 'flex' : 'none'};
    flex-direction: column;
    width: 150px;
    background: #FFFFFF;
    border: 1px solid #EEEFEF;
    box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);
    z-index: 100;
`;

const OptionItem = styled.div `
    color: #414141;
    font-size: 18px;
    cursor: pointer;
    padding: 10px 5px;
    transition: .2s;

    &:hover {
        background-color: #F2F2F2;
    }
`;


class FeedItem extends Component {
    constructor() {
        super();

        this.state = {
            showMenu: false
        }

        this.dropdownMenu = React.createRef();
    }

    showMenu = (e) => {
        this.setState({ showMenu: true }, () => {
          document.addEventListener('click', this.closeMenu);
        });
    }

    closeMenu = (e) => {
        if(!this.dropdownMenu.includes(e.target)) {
            console.log('yes')

            this.setState({ showMenu: false }, () => {
                document.removeEventListener('click', this.closeMenu);
            });
        }
    }

    render(props) {
        const { showMenu } = this.state;

        return(
            <Container item={this.props.id}>
                    <UserOptions onClick={() => this.showMenu()} ref={this.dropdownMenu}>

                        <OptionMenu showMenu={showMenu}>
                            <OptionItem>Share</OptionItem>
                            <OptionItem>Something</OptionItem>
                        </OptionMenu>
                    </UserOptions>
            </Container>
        );
    }
}

export default FeedItem;

我正在使用样式组件,这可能是个问题吗?此外,我已经删除了容器的大部分部分,并且刚刚离开了问题区域。

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

includesStringArray 方法,而不是 Node 方法。

您可以改用contains

closeMenu = (e) => {
    if (!this.dropdownMenu.current.contains(e.target)) {
        console.log('yes')

        this.setState({ showMenu: false }, () => {
            document.removeEventListener('click', this.closeMenu);
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2019-09-15
    相关资源
    最近更新 更多