У меня есть реквизиты с именем isAuthenticated, и это также показывает, что в моей консоли сохраняется какое-то предупреждение. Пожалуйста, проверь это.
import React,{Component} from "react";
import {BrowserRouter as Router, Switch, Route} from "react-router-dom";
import LogoutHome from './Logout_Home';
import SignIn from '../Components/SignIn';
import jwt_decode from 'jwt-decode';
import {setCurrentUser} from '../actions/authActions';
import SignUp from '../Components/SignUp';
import setAuthToken from '../util/setAuthToken';
import AboutUs from '../containers/AboutUs';
import store from '../store';
import {connect} from "react-redux";
// check for TOKEN
if (localStorage.jwtToken) {
// Set auth token header auth
setAuthToken(localStorage.jwtToken);
// Decode token and get user info and exp
const decoded = jwt_decode(localStorage.jwtToken);
// Set user and isAuthenticated
store.dispatch(setCurrentUser(decoded));
// Check for expired token
const currentTime = Date.now() / 1000;
if (decoded.exp < currentTime) {
// Logout user
store.dispatch(logoutUser());
// Redirect to login
window.location.href = '/login';
}
}
class HomePage extends Component
{
componentDidMount(){
console.info(this.props.auth.isAuthenticated);
}
render(){
var {
isAuthenticated
} = this.props.auth;
return(
<div>
<Router>
<div>
<Switch>
{this.props.auth.isAuthenticated===false ? (
<div>
<Route exact path='/' component = {LogoutHome}/>
<Route path='/Finance/Login' component = {SignIn}/>
<Route path='/Finance/AboutUs' component = {AboutUs}/>
<Route path='/Finance/ContactUs' component = {ContactUs}/>
<Route path='/Finance/SignUp' component = {SignUp}/>
<Route path='/Finance/Forgotpassword' component = {Forgotpassword}/>
</div>
) : (
<div>
<Route path='/Finance/Home' component = {Home}/>
</div>
)}
</Switch>
</div>
</Router>
</div>
);
}
}
function mapStateToProps(state){
return{
auth : state.auth
};
}
export default connect(mapStateToProps)(HomePage);
И предупреждение примерно такое:
index.js:2178 Warning: React does not recognize the `computedMatch` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `computedmatch` instead. If you accidentally passed it from a parent component, remove it from the DOM element.
in div (at Homepage.js:50)
in Switch (at Homepage.js:48)
in div (at Homepage.js:47)
in Router (created by BrowserRouter)
in BrowserRouter (at Homepage.js:46)
in div (at Homepage.js:45)
in HomePage (created by Connect(HomePage))
in Connect(HomePage) (at App.js:10)
in div (at App.js:9)
in App (at index.js:10)
in Provider (at index.js:9)
Я не понимаю, погода это проблема или что, потому что я читал это во многих местах, но получаю разные ответы. Выше вставлен только компонент домашней страницы.
Выше размещен только компонент HomePage. Пожалуйста, проверьте обновленный вопрос.
Хорошо .. Прочтите это блог. У него есть ответ для вас .. :) Эти <div> являются виновниками внутри <Switch>, используйте Fragment для решения проблемы.
Нет необходимости в <div> над Switch. Также внутри Switch.
@RaviTeja ему там что-то нужно, но не <div> или какой-нибудь html-дом .. Но <> или <Fragement> решат эту проблему.





Из React док
The unknown-prop warning will fire if you attempt to render a DOM element with a prop that is not recognized by React as a legal DOM attribute/property. You should ensure that your DOM elements do not have spurious props floating around.
Внутри компонента <Switch> вы увидите строку ниже.
React.cloneElement(child, { location, computedMatch: match })
В этом случае child - это ваш <div></div>, поэтому нестандартные реквизиты computedMatch передаются на собственный внутренний узел <div>, поэтому React выдает вам здоровое предупреждение. Таким образом, использование <> или <Fragment> сбросит предупреждение.
Не могли бы вы подробнее объяснить свой обходной путь?
Я решаю эту проблему с тегом Удалить<div> внутри тега. или заменять<div> с <React.Fragment>.
в таком случае :
import React,{Component} from "react";
import {BrowserRouter as Router, Switch, Route} from "react-router-dom";
import LogoutHome from './Logout_Home';
import SignIn from '../Components/SignIn';
import jwt_decode from 'jwt-decode';
import {setCurrentUser} from '../actions/authActions';
import SignUp from '../Components/SignUp';
import setAuthToken from '../util/setAuthToken';
import AboutUs from '../containers/AboutUs';
import store from '../store';
import {connect} from "react-redux";
// check for TOKEN
if (localStorage.jwtToken) {
// Set auth token header auth
setAuthToken(localStorage.jwtToken);
// Decode token and get user info and exp
const decoded = jwt_decode(localStorage.jwtToken);
// Set user and isAuthenticated
store.dispatch(setCurrentUser(decoded));
// Check for expired token
const currentTime = Date.now() / 1000;
if (decoded.exp < currentTime) {
// Logout user
store.dispatch(logoutUser());
// Redirect to login
window.location.href = '/login';
}
}
class HomePage extends Component
{
componentDidMount(){
console.info(this.props.auth.isAuthenticated);
}
render(){
var {
isAuthenticated
} = this.props.auth;
return(
<div>
<Router>
<div>
<Switch>
{this.props.auth.isAuthenticated===false ? (
<React.Fragment>
<Route exact path='/' component = {LogoutHome}/>
<Route path='/Finance/Login' component = {SignIn}/>
<Route path='/Finance/AboutUs' component = {AboutUs}/>
<Route path='/Finance/ContactUs' component = {ContactUs}/>
<Route path='/Finance/SignUp' component = {SignUp}/>
<Route path='/Finance/Forgotpassword' component = {Forgotpassword}/>
</React.Fragment>
) : (
<React.Fragment>
<Route path='/Finance/Home' component = {Home}/>
</React.Fragment>
)}
</Switch>
</div>
</Router>
</div>
);
}
}
function mapStateToProps(state){
return{
auth : state.auth
};
}
export default connect(mapStateToProps)(HomePage);
Как говорили другие, проблема возникает из-за наличия <div> непосредственно внутри элемента <Switch>. Из документация для <Switch>:
All children of a
<Switch>should be<Route>or<Redirect>elements.
Таким образом, хотя вы, по-видимому, можете избавиться от этой ошибки, заключив свой элемент в тег фрагмента, он больше соответствует предполагаемому использованию, чтобы вместо этого обернуть его в элемент <Route>.
<Route> без реквизита должен обеспечивать предполагаемое поведение.
Решение простое, просто добавьте еще один слой <React.Fragment> после <Switch>. Надеюсь, поможет.
У меня была эта проблема с react-router-dom, потому что я поместил div в свой Switch. Вместо этого я переместил свой div за пределы моего Switch, и ошибка исчезла.
показать компонент
Homepage.