Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在React+Redux应用程序中单击外部关闭模式窗口?_Javascript_Reactjs_Redux_Modal Window - Fatal编程技术网

Javascript 如何在React+Redux应用程序中单击外部关闭模式窗口?

Javascript 如何在React+Redux应用程序中单击外部关闭模式窗口?,javascript,reactjs,redux,modal-window,Javascript,Reactjs,Redux,Modal Window,使应用程序反应+重复使用。里面有几张照片。当你点击一张照片时,你会看到一个带有较大照片和评论的模式窗口 ModalContainer的代码包含模态窗口本身: class ModalContainer extends Component { state = { name: '', comment: '', } componentDidMount() { const { isOpen, closeModal } = this.props if (isOp

使应用程序反应+重复使用。里面有几张照片。当你点击一张照片时,你会看到一个带有较大照片和评论的模式窗口

ModalContainer的代码包含模态窗口本身:

class ModalContainer extends Component {
  state = {
    name: '',
    comment: '',
  }

  componentDidMount() {
    const { isOpen, closeModal } = this.props
    if (isOpen) {
      document.body.style.overflow = 'hidden'
    }
    document.addEventListener('click', closeModal)
  }

  componentWillUnmount() {
    const { closeModal } = this.props
    document.body.style.overflow = 'auto'
    document.removeEventListener('click', closeModal)
  }

  inputChange = (e) => {
    this.setState({
      [e.target.name]: e.target.value,
    })
  }

  putComment = (e) => {
    e.preventDefault()
    const { comment, name } = this.state
    const { photo } = this.props
    axios
      .post(
        `https://boiling-refuge-66454.herokuapp.com/images/${photo.id}/comments`,
        { name: name, comment: comment, date: Date.parse(String(new Date())) }
      )
      .then((res) => {
        console.log(res)
      })
    this.setState({
      name: '',
      comment: '',
    })
  }

  render() {
    const { name, comment } = this.state
    const { closeModal, photo } = this.props
    const comments = photo.comments
    return (
      <>
        <Modal
          onClick={closeModal}
          src={photo.url}
          comments={comments}
          name={name}
          comment={comment}
          onChange={this.inputChange}
          onSubmit={this.putComment}
        />
      </>
    )
  }
}

export default connect(
  ({ modal }) => ({
    photo: modal.photo,
    isOpen: modal.isOpen,
  }),
  { closeModal }
)(ModalContainer)
如您所见,我有这个代码文档。addEventListener'click',componentDidMount生命周期方法中的closeModal。括号中包含action creator closeModal,它关闭我的模式。在这种情况下,它不能正常工作,因为即使我在模式中单击,它也会启动action creator。所以我不能在里面添加评论


在这种情况下,通过在窗口外单击来关闭模态窗口的正确方法是什么?

一种常见做法是在ModalOverlay中包装模态

将ModalOverlay风格设置为全屏

函数onOverlayClicke{ 闭合模态 e、 停止传播 } modalClick上的函数{ //需要停止传播到ModalOverlay onClick事件 e、 停止传播 } 回来
通常的做法是将Modal包装在ModalOverlay中

将ModalOverlay风格设置为全屏

函数onOverlayClicke{ 闭合模态 e、 停止传播 } modalClick上的函数{ //需要停止传播到ModalOverlay onClick事件 e、 停止传播 } 回来 如果模态是一个类组件,您可以将ref添加到它,如果它是一个函数组件,请使用fowardRef

如果模态是一个类组件,您可以将ref添加到它,如果它是一个函数组件,请使用fowardRef


那么,在ModalOverlay中返回什么呢?ModalOverlay是一个样式化的元素。您可以用so替换它,在ModalOverlay中返回什么?ModalOverlay是一个样式化的元素。你可以用
<Modal ref={modalNode => (this.modalNode = modalNode)}
handleClick = e => !this.modalNode.contains(e.target) && closeModal();

 componentDidMount() {
    const { isOpen, closeModal } = this.props
    if (isOpen) {
      document.body.style.overflow = 'hidden'
    }
    document.addEventListener('click', this.handleClick)
  }