为啥警告:未知事件处理程序属性`onSession`显示在 React 应用程序中?

Posted

技术标签:

【中文标题】为啥警告:未知事件处理程序属性`onSession`显示在 React 应用程序中?【英文标题】:Why the warning: Unknown event handler property `onSession` is displayed in React app?为什么警告:未知事件处理程序属性`onSession`显示在 React 应用程序中? 【发布时间】:2022-01-17 09:05:57 【问题描述】:

我对 React 还是很陌生,我有一个简单的应用程序,用户可以在其中通过单击“登录”按钮时显示的模式窗口登录。用户数据存储在 MongoDB 集合中,以验证用户在模式窗口中输入的电子邮件和密码,应用程序向服务发送请求,该服务返回登录用户的数据,如果发生任何错误,则不返回任何内容。如果用户存在,则 id 存储在本地存储中,则必须将其重定向到另一个页面。问题是显然方法'onSession'不存在因此产生警告:“事件处理程序的未知属性onSession”。

我创建了三个组件:“LoginForm.js”、“LoginModal.js”和“Menu.js”。第一个具有电子邮件和密码字段以及登录验证,第二个具有模式窗口的属性,最后一个用于显示“登录”按钮的导航栏。

LoginForm.js:

import React from 'react';
import  Col, Row, Form, Stack, Button, Image  from 'react-bootstrap';
import LoginIMG from '../../../assets/login.png'
import './LoginForm.css';

class LoginForm extends React.Component
    constructor(props) 
        super(props);
        this.state = 
           email: '',
           password: ''
        ;
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);


handleSubmit(event) 
    event.preventDefault();
    if(this.state.email === '' || this.state.password === '') 
        alert('You must fill all inputs');
    else
        fetch('http://localhost:8080/api/user/'+this.state.email+'/'+this.state.password)
        .then(res => res.json())
        .then(data => 
            if(data.id !== null) 
                localStorage.setItem('idUser', data.id);
                this.props.onHide();
                this.props.onSession();
            else
                alert('Wrong password or username');
            
        );
    


handleChange(event) 
    const target = event.target;
    const value = target.value;
    const name = target.name;
    this.setState(
        [name]: value
    );



render() 
    return (
        <div className="form">
            <br />
            <Row className="justify-content-md-center">
                <Form onSubmit=this.handleSubmit>
                    <Stack gap=3>
                        <Row className="justify-content-md-center">
                            <Col lg=6 md=4 className='text-center'>
                                <Image src=LoginIMG className="avatar" roundedCircle />
                            </Col>
                        </Row>
                        <Row className="justify-content-md-center">
                            <Col lg=6>
                                <Form.Group controlId="formEmail">
                                    <Form.Label>Email</Form.Label>
                                    <Form.Control type="email" name="email" value=this.state.email onChange=this.handleChange placeholder="Enter email" />
                                </Form.Group>
                            </Col>
                        </Row>
                        <Row className="justify-content-md-center">
                            <Col lg=6>
                                <Form.Group controlId="formPassword">
                                    <Form.Label>Password</Form.Label>
                                    <Form.Control type="password" name="password" value=this.state.password onChange=this.handleChange />
                                </Form.Group>
                            </Col>
                        </Row>
                        <Row className="justify-content-md-center">
                            <Col lg=6 className="d-grid gap-2">
                                <Button type="submit" variant="success" size="lg">Login</Button>
                            </Col>
                        </Row>
                    </Stack>
                </Form>
            </Row>
        </div>
    );
  


export default LoginForm;

LoginModal.js:

import LoginForm from '../../forms/loginForm/LoginForm'
import  Modal  from 'react-bootstrap'; 
import './LoginModal.css';

function LoginModal(props)
   return (
       <Modal ...props size="lg" aria-labelledby="contained-modal-title-vcenter" centered>
           <Modal.Header closeButton>
              <Modal.Title id="contained-modal-title-vcenter">
                 props.title
              </Modal.Title>
           </Modal.Header>
           <Modal.Body>
               <LoginForm onHide=props.onHide />
           </Modal.Body>
        <Modal.Footer>
            /* <Button onClick=props.onHide>Close</Button> */
        </Modal.Footer>
    </Modal>
   );


export default LoginModal;

Menu.js:

import React from 'react';
import Navbar, Nav, Container from 'react-bootstrap';
import  Link  from "react-router-dom";
import LoginModal from '../../modals/loginModal/LoginModal';
import  useState  from 'react';


function Menu()
    const [modalShow, setModalShow] = useState(false);
    const [idUser, setIdUser] = useState(0);

    const setSession = () => 
        if(localStorage.getItem('idUser') != null)
           setIdUser(localStorage.getItem('idUser'));
           console.log(idUser);
        
    

return(
    <>
        <Navbar bg="dark" expand="lg" variant="dark">
            <Container>
                <Link className='navbar-brand' to="/">Divina Comedia</Link>
                <Navbar.Toggle aria-controls="basic-navbar-nav" />
                <Navbar.Collapse id="basic-navbar-nav">
                    <Nav className="me-auto">
                        <Link className='nav-link' to="/">Home</Link>
                        idUser === 0 ? <Nav.Link id="login" onClick=() => setModalShow(true)>Login</Nav.Link> : null 
                        idUser !== 0 ? <Link className='nav-link' to="/orders">Orders</Link> : null 
                    </Nav>
                </Navbar.Collapse>
            </Container>
        </Navbar>
        <LoginModal show=modalShow onHide=() => setModalShow(false) onSession=() => setSession() />
    </>
   );


export default Menu;

我真的不知道出了什么问题,感谢任何帮助。

【问题讨论】:

【参考方案1】:
onSession=() => setSession()

这被传递到LoginModal,然后在 LoginModal.js 中将它传递到Modal

<Modal ...props

还有Modalultimately ends up putting it on a&lt;div&gt;。没有具有该名称的 dom 事件,因此您会收到错误消息。

如果该道具是为LoginModal 设计的,那么请确保您在那里处理它,并且不要使用扩展语法将其传递给 Modal。例如:

function LoginModal( onSession, ...rest )
  // Do something with the onSession prop

  return (
    <Modal ...rest size="lg" aria-labelledby="contained-modal-title-vcenter" centered>
    // Or maybe do something with it here?
  )

【讨论】:

以上是关于为啥警告:未知事件处理程序属性`onSession`显示在 React 应用程序中?的主要内容,如果未能解决你的问题,请参考以下文章

单击删除会引发错误未知事件处理程序属性`onDelete`

如何杀死“未知属性'扁平'被忽略”警告?

如何在 Eclipse Mars 中禁用 CSS 警告“未知属性”?

javafx中每个.css文件和行的“未知属性”警告

VueJS:为啥这个数据属性没有在开发工具中的点击事件上更新?

React 扩展运算符未知的支柱警告