GVKun编程网logo

如何为 React 路由器 dom 路由中的每个组件获取嵌套资源(react-router-dom嵌套路由)

1

在本文中,我们将详细介绍如何为React路由器dom路由中的每个组件获取嵌套资源的各个方面,并为您提供关于react-router-dom嵌套路由的相关解答,同时,我们也将为您带来关于./node_m

在本文中,我们将详细介绍如何为 React 路由器 dom 路由中的每个组件获取嵌套资源的各个方面,并为您提供关于react-router-dom嵌套路由的相关解答,同时,我们也将为您带来关于./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 0.14 发布,拆分为 react 和 react-dom的有用知识。

本文目录一览:

如何为 React 路由器 dom 路由中的每个组件获取嵌套资源(react-router-dom嵌套路由)

如何为 React 路由器 dom 路由中的每个组件获取嵌套资源(react-router-dom嵌套路由)

如何解决如何为 React 路由器 dom 路由中的每个组件获取嵌套资源

所以我有一些看起来像这样的嵌套路由:

<Switch>
  <Route exact path={"/"}>
    <HomepageContainer />
  </Route>
  <Route path={"/users"}>
    <UsersContainer />
  </Route>
  <Route path={"/users/new"}>
    <NewUserContainer />
  </Route>
  <Route path={"/users/:userId/edit"}>
    <EditUserContainer />
  </Route>
  <Route path={"/users/:userId/comments"}>
    <UserCommentsContainer />
  </Route>
  <Route path={"/users/:userId/comments/:commentId"}>
    <UserCommentContainer />
  </Route>
  <Route render={() => <Redirect to={"/"} />} />
</Switch>

其中三个在 URL 参数中有一个 userId,在这些组件中,我在 useEffect 钩子内获取用户。

有没有办法让 react-router-dom 允许我在一个地方执行此提取,并将结果提供给 EditUserContainer、UserCommentsContainer 和 UserCommentContainer?

解决方法

我找到了一个令我满意的解决方案,但不知道为什么我最初没有想到它(仍在学习 React!)

<Switch>
  <Route exact path={"/"}>
    <HomepageContainer />
  </Route>
  <Route path={"/users"}>
    <UsersContainer />
  </Route>
  <Route path={"/users/new"}>
    <NewUserContainer />
  </Route>
  <Route path={"/users/:userId/edit"} render={() => {
    <CurrentUserContainer>
      <EditUserContainer />
    </CurrentUserContainer>
  }} />
  <Route path={"/users/:userId/comments"} render={() => {
    <CurrentUserContainer>
      <UserCommentsContainer />
    </CurrentUserContainer>
  }} />
  <Route path={"/users/:userId/comments/:commentId"} render={() => {
    <CurrentUserContainer>
      <UserCommentContainer />
    </CurrentUserContainer>
  }} />
  <Route render={() => <Redirect to={"/"} />} />
</Switch>

将每个嵌套的用户组件包装在一个父 CurrentUserContainer 中,它负责执行获取和设置状态,使其在需要的地方可用。

./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=?>行。

解决方法

为什么只安装两个都需要,这可以工作

  1. 执行npm删除react-router
  2. 删除node_modules
  3. 纱线安装或npm安装和
  4. 启动纱线或启动npm

DOM、SAX、JDOM DOM、JDOM SAX、DOM4J DOM、DOM4J SAX 性能比对

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:没有路由器的提供程序

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 0.14 发布,拆分为 react 和 react-dom

React 0.14 发布,拆分为 react 和 react-dom

React 0.14 正式发布,此版本包括一些重要的改进,主要是简化代码编写,提供更好的支持环境,比如 React Native。

Reactjs 0.14 获取:

  • React
    Dev build with warnings: https://fb.me/react-0.14.0.js
    Minified build for production: https://fb.me/react-0.14.0.min.js

  • React with Add-Ons
    Dev build with warnings: https://fb.me/react-with-addons-0.14.0.js
    Minified build for production: https://fb.me/react-with-addons-0.14.0.min.js

  • React DOM (include React in the page before React DOM)
    Dev build with warnings: https://fb.me/react-dom-0.14.0.js
    Minified build for production: https://fb.me/react-dom-0.14.0.min.js

React 「一分为二」

原本的 react package 被拆分为 reactreact-dom 两个 package。其中 react package 中包含 React.createElement.createClass.Component.PropTypes.Children 这些 API,而 react-dom package 中包含 ReactDOM.render.unmountComponentAtNode.findDOMNode

原本在服务端渲染用的两个 API .renderToString.renderToStaticMarkup 被放在了 react-dom/server 中。

改变之后的结构,一个基本的 React 组件变成了这样:

var React = require(''react'');  
var ReactDOM = require(''react-dom'');var MyComponent = React.createClass({  
  render: function() {
    return <div>Hello World</div>;
  }
});

ReactDOM.render(<MyComponent />, node);

此外,原本 React.addons 下面的工具全部变成了独立的 package:

  • react-addons-clone-with-props

  • react-addons-create-fragment

  • react-addons-css-transition-group

  • react-addons-linked-state-mixin

  • react-addons-perf

  • react-addons-pure-render-mixin

  • react-addons-shallow-compare

  • react-addons-test-utils

  • react-addons-transition-group

  • react-addons-update

  • ReactDOM.unstable_batchedUpdates (在 react-dom 中)

当然,原本的 API 在 v0.14 版中仍然可以使用,只不过会有 warning,最终会在 v0.15 版的时候完全移除。

refs 变成了真正的 DOM 节点

当我们需要获取 React 组件上某个 DOM 节点时,React 提供了 refs 方法方便我们快速引用。为了方便我们使用,React 还「贴心」地对 refs 做了一层封装,使用 this.refs.xxx.getDOMNode()React.findDOMNode(this.refs.xxx) 可以获取到真正的 DOM 节点。

结果发现大家真正需要的就是 DOM 节点本身,封装了半天完全是浪费感情。

于是在 v0.14 版中 refs 指向的就是 DOM 节点,同时也会保留 .getDOMNode() 方法(带 warning),最终在 v0.15 版中去除该方法。

var Zoo = React.createClass({  
  render: function() {
    return <div>Giraffe name: <input ref="giraffe" /></div>;
  },
  showName: function() {
    // 之前:
    // var input = this.refs.giraffe.getDOMNode();
    //
    // v0.14 版:
    var input = this.refs.giraffe;
    alert(input.value);
  }
});

需要注意的是,如果你给自定义的 React 组件(除了 DOM 自带的标签,如 divp 等)添加 refs,表现和行为与之前一致。

无状态的函数式组件

其实在实际业务系统中使用 React 时,我们会写很多只有 render 方法的 React 组件。为了减少冗余的代码量,React v0.14 中引入了 无状态的函数式组件(Stateless functional components) 的概念。先看看长啥样:

// 一个 ES6 箭头函数定义的无状态函数式组件var Aquarium = (props) => {  
  var fish = getFish(props.species);  return <Tank>{fish}</Tank>;
};// 或者更加简化的版本var Aquarium = ({species}) => (  
  <Tank>
    {getFish(species)}
  </Tank>
);// 最终使用方式: <Aquarium species="rainbowfish" />

可以看到,没有 React.createClass,也没有显式的 render,写起来更加轻松了。

当然,新语法也有需要注意的地方:

  1. 没有任何生命周期方法,如 componentDidMount

  2. 不能添加 refs

  3. 可以通过给函数添加属性定义 propTypesdefaultProps

react-tools 及 JSXTransformer.js 已弃用

拥抱 Babel 吧同学们!

编译器优化

在 Babel 5.8.23 及更新的版本中,新增了两项专门针对 React 的优化配置,仅推荐在生产环境中开启,因为优化后会导致代码的报错更加扑朔迷离(本来报错就已经很难定位了……)。

  • optimisation.react.inlineElements 将 JSX 元素转换为对象而非使用 React.createElement

  • optimisation.react.constantElements 针对拥有完全静态子树的组件,将其创建过程提升到顶层(Top level),从而减少对 React.createElement 方法的调用

其它变化

  • React.initializeTouchEvents 已弃用

  • 由于 refs 的相关变化(见上文),TestUtils.findAllInRenderedTree 及相关的方法不再接受 DOM 组件作为参数,只能传入自定义的 React 组件

  • props 一旦创建永远不可修改,因此 .setProps.replaceProps 已废弃

  • children 不可以传对象类型,推荐传入数组,或使用 React.createFragment 方法(其实就是转换为了数组)

  • React.addons.classSet 已经移除,使用 classnames package 替代

将要发生的改变

在 v0.15 版中,下列内容将会发生改变:

  • this.getDOMNode() 方法将会废弃,推荐使用 React.findDOMNode()

  • setPropsreplaceProps 将会废弃

  • React.addons.cloneWithProps 已废弃,推荐使用 React.cloneElements,新方法不会自动 merge classNamestyle

  • React.addons.CSSTransitionGroup 将不再监听 transition 事件,因此使用者需要显式指定动画的 timeout,如:transitionEnterTimeout={500}

  • ES6 组件类必须 extends React.Component(如果使用 React.createClass 语法则不受影响)

  • 在多次 render 中重用并改变 style 对象已经被弃用(这一点不是太明白,中心思想貌似是不要 mutate object?)

更多内容请看发行说明。

内容转载自:http://undefinedblog.com/react-v0-14/ 

我们今天的关于如何为 React 路由器 dom 路由中的每个组件获取嵌套资源react-router-dom嵌套路由的分享已经告一段落,感谢您的关注,如果您想了解更多关于./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 0.14 发布,拆分为 react 和 react-dom的相关信息,请在本站查询。

本文标签: