本文将为您提供关于useEffect后在React路由器dom中渲染路由的详细介绍,我们还将为您解释react路由按需加载的相关知识,同时,我们还将为您提供关于./node_modules/react
本文将为您提供关于useEffect 后在 React 路由器 dom 中渲染路由的详细介绍,我们还将为您解释react路由按需加载的相关知识,同时,我们还将为您提供关于./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”、DOM、SAX、JDOM DOM、JDOM SAX、DOM4J DOM、DOM4J SAX 性能比对、NullInjectorError:R3InjectorError(AppModule)[路由器->路由器->路由器]:NullInjectorError:没有路由器的提供程序、React - 从 useEffect 更新调度中的数据 在初始渲染后运行一次“useEffect”每次依赖项发生变化时运行“useEffect”状态更新和重新渲染的无限循环的实用信息。
本文目录一览:- useEffect 后在 React 路由器 dom 中渲染路由(react路由按需加载)
- ./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”
- DOM、SAX、JDOM DOM、JDOM SAX、DOM4J DOM、DOM4J SAX 性能比对
- NullInjectorError:R3InjectorError(AppModule)[路由器->路由器->路由器]:NullInjectorError:没有路由器的提供程序
- React - 从 useEffect 更新调度中的数据 在初始渲染后运行一次“useEffect”每次依赖项发生变化时运行“useEffect”状态更新和重新渲染的无限循环
useEffect 后在 React 路由器 dom 中渲染路由(react路由按需加载)
如何解决useEffect 后在 React 路由器 dom 中渲染路由
我需要在 useEffect 检查用户是否具有所需角色后渲染组件,但它总是重定向我,因为它首先执行渲染函数,然后执行 useEffect
这是我的代码:
import { Route,Redirect } from ''react-router-dom'';
import React,{ useEffect,useState } from ''react'';
import { useSelector } from ''react-redux'';
import { checkIfUserHasrequiredRole } from ''../../utility/utility'';
import PathConst from ''../../utils/PathConst'';
const AuthRoute = ({
Component,path,exact = false,isAuthenticated,requiredRoles,}) => {
const [userHasrequiredRole,setUserHasrequiredRole] = useState(false);
const roles = useSelector((state) => state.role.roles);
const isAuthed = isAuthenticated;
useEffect(() => {
if (roles) {
const userRole = checkIfUserHasrequiredRole(requiredRoles,roles);
setUserHasrequiredRole(userRole);
}
},[roles]);
return (
<Route
exact={exact}
path={path}
render={() => (
isAuthed && userHasrequiredRole ? (<Component />)
: (
<Redirect
to={PathConst.toLoginPage}
/>
))}
/>
);
};
export default AuthRoute;
函数''checkIfUserHasrequiredRole'' 返回真,但''useHasrequiredRole'' 在触发if 语句时仍然为假。我还尝试使用没有依赖项的相同 useEffect 函数。 我该如何管理?
解决方法
您可以进行设置,但这需要额外的渲染,以便 userHasRequiredRole
更新并生效。
既然您可以根据 roles
确定您需要什么,那么您可以,
import { useHistory } from "react-router-dom";
const history = useHistory();
useEffect(() => {
if (roles) {
const userRole = checkIfUserHasRequiredRole(requiredRoles,roles);
if (this role is not good) {
history.push(PathConst.toLoginPage)
}
}
},[roles])
./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”
如何解决./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”
./node_modules/react-router-dom/react-router-dom.js Attempted import error: ''Navigate'' is not exported from ''react-router''.
react-router-dom的版本是6.0.0-alpha.2,而react-router是5.2.0。 两者均已正确安装。我不确定如何解决此错误。有人可以给我任何可能的解决方法吗?
我的代码中甚至没有<Navigate to=?>
行。
解决方法
为什么只安装两个都需要,这可以工作
- 执行npm删除react-router
- 删除node_modules
- 纱线安装或npm安装和
- 启动纱线或启动npm
DOM、SAX、JDOM DOM、JDOM SAX、DOM4J DOM、DOM4J SAX 性能比对
测试xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<RESULT>
<VALUE>
<NO>A1234</NO>
<ADDR>XX号</ADDR>
</VALUE>
<VALUE>
<NO>B1234</NO>
<ADDR>XX组</ADDR>
</VALUE>
</RESULT>
测试代码:
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.DOMReader;
import org.dom4j.io.SAXReader;
import org.jdom.Element;
import org.jdom.input.DOMBuilder;
import org.jdom.input.SAXBuilder;
import org.junit.Test;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XMLParserTest {
@Test
public void testDOMTypeParseXML() throws ParserConfigurationException, SAXException,
IOException {
long lasting =System.currentTimeMillis();
InputStream is = XMLParserTest.class.getClassLoader().getResourceAsStream("test.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
org.w3c.dom.Document doc = builder.parse(is);
org.w3c.dom.NodeList nl = doc.getElementsByTagName("VALUE");
for (int i=0;i<nl.getLength();i++){
// System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
// System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
long end = System.currentTimeMillis();
System.out.println("DOM TYPE PARSE COST "+(end - lasting)+"毫秒");
}
public class MyXMLReader extends DefaultHandler{
@SuppressWarnings("rawtypes")
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
}
@SuppressWarnings("unchecked")
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);
}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
// System.out.print("车牌号码:" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
// System.out.println("地址:" + new String(ch, start, length));
}
}
}
@Test
public void testSAXTypeParseXML() throws SAXException, IOException, ParserConfigurationException{
long lasting = System.currentTimeMillis();
InputStream is = XMLParserTest.class.getClassLoader().getResourceAsStream("test.xml");
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader me = new MyXMLReader();
sp.parse(is, me);
System.out.println("SAX TYPE PARSE COST "+(System.currentTimeMillis() - lasting)+"毫秒");
}
@Test
public void testJDOMSAXTypeParseXML(){
long lasting = System.currentTimeMillis();
try {
InputStream is = XMLParserTest.class.getClassLoader().getResourceAsStream("test.xml");
SAXBuilder builder = new SAXBuilder();
org.jdom.Document doc = builder.build(is);
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;i < allChildren.size();i++) {
// System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());
// System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}finally{
System.out.println("JDOM SAX TYPE PARSE COST "+(System.currentTimeMillis() - lasting)+"毫秒");
}
}
@Test
public void testJDOMDOMTypeParseXML(){
long lasting = System.currentTimeMillis();
try {
InputStream is = XMLParserTest.class.getClassLoader().getResourceAsStream("test.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
org.w3c.dom.Document document = builder.parse(is);
DOMBuilder builder1 = new DOMBuilder();
org.jdom.Document doc = builder1.build(document);
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;i < allChildren.size();i++) {
// System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());
// System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}finally{
System.out.println("JDOM DOM TYPE PARSE COST "+(System.currentTimeMillis() - lasting)+"毫秒");
}
}
@Test
public void testDOM4JSAXTypeParserXML() throws DocumentException{
long lasting = System.currentTimeMillis();
InputStream is = XMLParserTest.class.getClassLoader().getResourceAsStream("test.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(is);
org.dom4j.Element root = doc.getRootElement();
org.dom4j.Element foo;
for (Iterator i = root.elementIterator("VALUE");i.hasNext();){
foo = (org.dom4j.Element)i.next();
// System.out.print("车牌号码:" + foo.elementText("NO"));
// System.out.println("车主地址:" + foo.elementText("ADDR"));
}
System.out.println("DOM4J SAX TYPE PARSE COST "+(System.currentTimeMillis() - lasting)+"毫秒");
}
@Test
public void testDOM4JDOMTypeParserXML() throws DocumentException, ParserConfigurationException, SAXException, IOException{
long lasting = System.currentTimeMillis();
InputStream is = XMLParserTest.class.getClassLoader().getResourceAsStream("test.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
org.w3c.dom.Document document = builder.parse(is);
DOMReader reader = new DOMReader();
Document doc = reader.read(document);
org.dom4j.Element root = doc.getRootElement();
org.dom4j.Element foo;
for (Iterator i = root.elementIterator("VALUE");i.hasNext();){
foo = (org.dom4j.Element)i.next();
// System.out.print("车牌号码:" + foo.elementText("NO"));
// System.out.println("车主地址:" + foo.elementText("ADDR"));
}
System.out.println("DOM4J DOM TYPE PARSE COST "+(System.currentTimeMillis() - lasting)+"毫秒");
}
}
结论:
当测试xml文件大小为50kb左右时:
DOM TYPE PARSE COST 144毫秒
SAX TYPE PARSE COST 43毫秒
JDOM SAX TYPE PARSE COST 179毫秒
JDOM DOM TYPE PARSE COST 145毫秒
DOM4J SAX TYPE PARSE COST 128毫秒
DOM4J DOM TYPE PARSE COST 106毫秒
NullInjectorError:R3InjectorError(AppModule)[路由器->路由器->路由器]:NullInjectorError:没有路由器的提供程序
将 HttpClient 导入您的 .service.ts
import { HttpClient } from '@angular/common/http';
将HttpClientModule导入app.module.ts并添加HttpClientModule导入数组
import { HttpClientModule } from '@angular/common/http';
imports: [
BrowserModule,AppRoutingModule,HttpClientModule
],
,
我在使用 @angular/router
的服务中遇到了同样的错误。我能够通过替换来修复它
@Injectable()
与
@Injectable({
providedIn: 'root'
})
在服务类中。
React - 从 useEffect 更新调度中的数据 在初始渲染后运行一次“useEffect”每次依赖项发生变化时运行“useEffect”状态更新和重新渲染的无限循环
如何解决React - 从 useEffect 更新调度中的数据 在初始渲染后运行一次“useEffect”每次依赖项发生变化时运行“useEffect”状态更新和重新渲染的无限循环
我正在尝试在 useEffect 中更新 dispatch 中的数据,但在控制台中显示警告
React Hook useEffect has missing dependencies: ''dispatch'',''id'',and ''state.selectedHotel''. Either include them or remove the dependency array react-hooks/exhaustive-deps
代码
import { GlobalContext } from "../../../context/globalContext";
const HotelDetail = () => {
const [state,dispatch] = useContext(GlobalContext);
const { id } = useParams();
useEffect(() => {
const hotelData = async () => {
try {
let response = await ServiceGetAllHotels();
let hotel = response.hotels.filter(hotel => {
return hotel.hotelUserName === id;
});
dispatch({
type: "UPDATE",payload: { selectedHotel: hotel[0] }
});
}catch(){}
};
},[])
};
但是当我添加这个(下面的代码)时警告信息消失了
useEffect(() => {
.....
},[dispatch,state.selectedHotel,id])
我不明白为什么会出现这个错误/警告,为什么添加这个错误会消失?请帮助我可以使用此代码吗?
解决方法
这不是错误,而是警告,可以避免由于 useEffect
钩子未按预期运行而导致的错误。
useEffect
钩子,默认情况下,在以下时间执行:
- 初始渲染
- 每次重新渲染组件时
有时我们不希望这种默认行为;将第二个可选参数传递给 useEffect
钩子会更改 useEffect
钩子的默认执行行为。 useEffect
钩子的第二个参数被称为它的依赖数组,它告诉 React 何时执行 useEffect
钩子。
在初始渲染后运行一次“useEffect”
我们可以通过将一个空数组作为第二个参数传递给 useEffect
钩子来实现这一点:
useEffect(() => {
// code
},[]);
这个效果只会执行一次,类似于类组件中的componentDidMount
。
每次依赖项发生变化时运行“useEffect”
当 useEffect
中的代码依赖于状态或道具时,您有时希望 useEffect
在每次状态或道具更改时执行。 >
我们如何告诉 React 在每次特定状态或道具更改时运行效果?通过在 useEffect
钩子的依赖数组中添加该状态或道具。
示例:
想象一个 Post
组件,它接收帖子 ID 作为道具,并获取与该帖子相关的评论。
您可以编写以下代码来获取评论:
useEffect(() => {
fetch(`/${props.postId}`)
.then(res => res.json())
.then(comments => setComments(comments))
.catch(...)
},[]);
上面代码的问题:
当 Post
组件第一次呈现时,useEffect
钩子将执行,使用作为参数传入的帖子的 id 获取评论。
但是如果在 Post
组件的第一次呈现期间帖子 ID 发生变化或帖子 ID 不可用怎么办?
如果帖子 id 属性发生变化,Post
组件将重新渲染但不会获取帖子评论,因为 useEffect
钩子只会在初始渲染后执行一次。
你如何解决这个问题?
通过在 useEffect
钩子的依赖数组中添加 post id prop。
useEffect(() => {
fetch(`/${props.postId}`)
.then(res => res.json())
.then(comments => setComments(comments))
.catch(...)
},[props.postId]);
现在每次帖子 id 更改时,都会执行 useEffect
,获取与帖子相关的评论。
如果缺少 useEffect
钩子的依赖项,您可能会遇到这种问题,而 React 会就此警告您。
您不应省略 useEffect
钩子或其他钩子的任何依赖项,例如:useMemo
或 useCallback
。不省略它们将使您免于来自 React 的此类警告,但更重要的是,它将使您免于错误。
状态更新和重新渲染的无限循环
在 useEffect
的依赖数组中添加依赖时要记住的一件事是,如果您不小心,您的代码可能会陷入无限循环:
useEffect --> state update ---> re-render --> useEffect ....
考虑以下示例:
useEffect(() => {
const newState = state.map(...);
setState(data);
},[state,setState]);
在上面的例子中,如果我们从依赖数组中删除state
,我们会得到一个关于缺少依赖的警告,如果我们在数组中添加state
,我们会得到一个无限循环状态更新和重新渲染。
我们能做什么?
一种方法是跳过 state
作为 useState
钩子的依赖项并使用以下命令禁用警告:
// eslint-disable-next-line react-hooks/exhaustive-deps
以上解决方案可行,但并不理想。
理想的解决方案是以允许您删除导致问题的依赖项的方式更改您的代码。在这种情况下,我们可以简单地使用 setState
的函数形式,它带有一个回调函数,如下所示:
useEffect(() => {
setState(currState => currState.map(...));
},[setState]);
现在我们不需要在依赖数组中添加 state
- 问题解决了!
总结
- 不要省略
useEffect
钩子的依赖 - 注意状态更新和重新渲染的无限循环。如果您遇到此问题,请尝试更改您的代码,以便您可以安全地移除导致无限循环的依赖
useEffect
钩子接受两个参数。第一个是经典回调,第二个是所谓的“依赖项”数组。
钩子被设计为在组件挂载后立即执行回调(在元素成功添加到真实 DOM 并且引用可用之后),然后在每次渲染时执行,如果依赖项数组中的值至少有一个改变了。
因此,如果您传递一个空数组,则您的回调将在组件的整个生命周期内仅执行一次。
如果你从记忆的角度考虑它是有道理的。每次执行组件函数时,都会创建一个新的回调,存储对当前执行上下文变量的引用。如果这些变量发生变化并且没有创建新的回调,那么旧的回调仍将使用旧值。
这就是为什么“缺少依赖项”被标记为警告(不是错误)的原因,代码可以完美地处理缺少的依赖项,有时也可能是故意的。即使您始终可以添加所有依赖项,然后执行内部检查。传递所有依赖项是一种很好的做法,这样您的回调始终是最新的。
关于useEffect 后在 React 路由器 dom 中渲染路由和react路由按需加载的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”、DOM、SAX、JDOM DOM、JDOM SAX、DOM4J DOM、DOM4J SAX 性能比对、NullInjectorError:R3InjectorError(AppModule)[路由器->路由器->路由器]:NullInjectorError:没有路由器的提供程序、React - 从 useEffect 更新调度中的数据 在初始渲染后运行一次“useEffect”每次依赖项发生变化时运行“useEffect”状态更新和重新渲染的无限循环等相关知识的信息别忘了在本站进行查找喔。
本文标签: