Is it compulsory to use <Route> only inside of App.js? throwing error like "Error: Invariant failed: You should not use <Link> outside a <Router>"
Is it compulsory to use <Route> only inside of App.js? throwing error like "Error: Invariant failed: You should not use <Link> outside a <Router>"
是否必须在App.js中使用react-router?
我正在尝试在我的应用程序中使用 React 路由器,但遇到了问题。
我有一个名为 ProductList.jsx 的组件。在该组件中,我想定义 Cart.jsx 组件的路径,使用 .我绝对想在 ProductList.jsx 中定义 Cart.jsx 的路径,因为它确实从 ProductList.jsx.
中获取了一些道具
当我尝试定义路径时,它会抛出类似“错误:不变量失败:您不应在 <Router>
之外使用 <Link>
”的错误“=15=]
包括下面的代码
App.jsx
import Home from "./pages/Home";
const App = () => {
return (
<>
<Home />
</>
)
};
export default App
Home.jsx
const Home = () => {
return (
<div>
<Navbar />
<Slider/>
<Categories/>
<PopularProducts/>
<ProductList/>
<Footer/>
</div>
);
};
ProductList.jsx
const ProductList = () => {
const [mobileOpen, setMobileOpen] = useState(false);
const [products, setProducts] = useState([]);
const [cart, setCart] = useState({});
const [order, setOrder] = useState({});
const [errorMessage, setErrorMessage] = useState('');
const fetchProducts = async () => {
const { data } = await commerce.products.list();
setProducts(data);
};
const fetchCart = async () => {
setCart(await commerce.cart.retrieve());
};
const handleAddToCart = async (productId, quantity) => {
const item = await commerce.cart.add(productId, quantity);
setCart(item.cart);
};
const handleUpdateCartQty = async (lineItemId, quantity) => {
const response = await commerce.cart.update(lineItemId, { quantity });
setCart(response.cart);
};
const handleRemoveFromCart = async (lineItemId) => {
const response = await commerce.cart.remove(lineItemId);
setCart(response.cart);
};
const handleEmptyCart = async () => {
const response = await commerce.cart.empty();
setCart(response.cart);
};
const refreshCart = async () => {
const newCart = await commerce.cart.refresh();
setCart(newCart);
};
const handleCaptureCheckout = async (checkoutTokenId, newOrder) => {
try {
const incomingOrder = await commerce.checkout.capture(checkoutTokenId, newOrder);
setOrder(incomingOrder);
refreshCart();
} catch (error) {
setErrorMessage(error.data.error.message);
}
};
useEffect(() => {
fetchProducts();
fetchCart();
}, []);
const handleDrawerToggle = () => setMobileOpen(!mobileOpen);
const user= ''
return (
<Container>
<Navbar />
<Router>
<div style={{ display: 'flex' }}>
<CssBaseline />
<Switch>
<Route path="/login" >
{user ? <Redirect to="/"/> : <Login/> }
</Route>
<Route path="/register" >
<Register />
</Route>
<Route path="/products">
<Products products={products} onAddToCart={handleAddToCart} handleUpdateCartQty />
<Footer/>
</Route>
<Route exact path="/cart">
<Cart cart={cart} onUpdateCartQty={handleUpdateCartQty} onRemoveFromCart={handleRemoveFromCart} onEmptyCart={handleEmptyCart} />
</Route>
<Route path="/checkout">
<Checkout cart={cart} order={order} onCaptureCheckout={handleCaptureCheckout} error={errorMessage} />
</Route>
</Switch>
</div>
</Router>
<Cart cart={cart} onUpdateCartQty={handleUpdateCartQty} onRemoveFromCart={handleRemoveFromCart} onEmptyCart={handleEmptyCart} />
<Footer/>
</Container>
);
};
export default ProductList;
"Error: Invariant failed: You should not use <Link>
outside a
<Router>
"
必须在内渲染所有Link
、Switch
和Route
组件路由上下文。从您的代码片段中,我没有看到 Router
渲染到 ProductList
组件中。我怀疑“link outside a router”问题是由于您的 Navbar
组件位于 Router
组件之外。
移动 Router
以包装整个应用程序。删除所有其他无关的路由器(如果有)。您只需要一个路由器即可为整个应用程序提供路由上下文。
import { BrowserRouter as Router } from 'react-router-dom';
const App = () => {
return (
<Router>
<Home />
</Router>
)
};
...
const ProductList = () => {
...
return (
<Container>
<Navbar />
<div style={{ display: 'flex' }}>
<CssBaseline />
<Switch>
... routes ...
</Switch>
</div>
...
</Container>
);
};
是否必须在App.js中使用react-router?
我正在尝试在我的应用程序中使用 React 路由器,但遇到了问题。
我有一个名为 ProductList.jsx 的组件。在该组件中,我想定义 Cart.jsx 组件的路径,使用 .我绝对想在 ProductList.jsx 中定义 Cart.jsx 的路径,因为它确实从 ProductList.jsx.
中获取了一些道具当我尝试定义路径时,它会抛出类似“错误:不变量失败:您不应在 <Router>
之外使用 <Link>
”的错误“=15=]
包括下面的代码
App.jsx
import Home from "./pages/Home";
const App = () => {
return (
<>
<Home />
</>
)
};
export default App
Home.jsx
const Home = () => {
return (
<div>
<Navbar />
<Slider/>
<Categories/>
<PopularProducts/>
<ProductList/>
<Footer/>
</div>
);
};
ProductList.jsx
const ProductList = () => {
const [mobileOpen, setMobileOpen] = useState(false);
const [products, setProducts] = useState([]);
const [cart, setCart] = useState({});
const [order, setOrder] = useState({});
const [errorMessage, setErrorMessage] = useState('');
const fetchProducts = async () => {
const { data } = await commerce.products.list();
setProducts(data);
};
const fetchCart = async () => {
setCart(await commerce.cart.retrieve());
};
const handleAddToCart = async (productId, quantity) => {
const item = await commerce.cart.add(productId, quantity);
setCart(item.cart);
};
const handleUpdateCartQty = async (lineItemId, quantity) => {
const response = await commerce.cart.update(lineItemId, { quantity });
setCart(response.cart);
};
const handleRemoveFromCart = async (lineItemId) => {
const response = await commerce.cart.remove(lineItemId);
setCart(response.cart);
};
const handleEmptyCart = async () => {
const response = await commerce.cart.empty();
setCart(response.cart);
};
const refreshCart = async () => {
const newCart = await commerce.cart.refresh();
setCart(newCart);
};
const handleCaptureCheckout = async (checkoutTokenId, newOrder) => {
try {
const incomingOrder = await commerce.checkout.capture(checkoutTokenId, newOrder);
setOrder(incomingOrder);
refreshCart();
} catch (error) {
setErrorMessage(error.data.error.message);
}
};
useEffect(() => {
fetchProducts();
fetchCart();
}, []);
const handleDrawerToggle = () => setMobileOpen(!mobileOpen);
const user= ''
return (
<Container>
<Navbar />
<Router>
<div style={{ display: 'flex' }}>
<CssBaseline />
<Switch>
<Route path="/login" >
{user ? <Redirect to="/"/> : <Login/> }
</Route>
<Route path="/register" >
<Register />
</Route>
<Route path="/products">
<Products products={products} onAddToCart={handleAddToCart} handleUpdateCartQty />
<Footer/>
</Route>
<Route exact path="/cart">
<Cart cart={cart} onUpdateCartQty={handleUpdateCartQty} onRemoveFromCart={handleRemoveFromCart} onEmptyCart={handleEmptyCart} />
</Route>
<Route path="/checkout">
<Checkout cart={cart} order={order} onCaptureCheckout={handleCaptureCheckout} error={errorMessage} />
</Route>
</Switch>
</div>
</Router>
<Cart cart={cart} onUpdateCartQty={handleUpdateCartQty} onRemoveFromCart={handleRemoveFromCart} onEmptyCart={handleEmptyCart} />
<Footer/>
</Container>
);
};
export default ProductList;
"Error: Invariant failed: You should not use
<Link>
outside a<Router>
"
必须在内渲染所有Link
、Switch
和Route
组件路由上下文。从您的代码片段中,我没有看到 Router
渲染到 ProductList
组件中。我怀疑“link outside a router”问题是由于您的 Navbar
组件位于 Router
组件之外。
移动 Router
以包装整个应用程序。删除所有其他无关的路由器(如果有)。您只需要一个路由器即可为整个应用程序提供路由上下文。
import { BrowserRouter as Router } from 'react-router-dom';
const App = () => {
return (
<Router>
<Home />
</Router>
)
};
...
const ProductList = () => {
...
return (
<Container>
<Navbar />
<div style={{ display: 'flex' }}>
<CssBaseline />
<Switch>
... routes ...
</Switch>
</div>
...
</Container>
);
};