reactjs - 在两个不同的 ids 渲染两个组件 - React

标签 reactjs react-router

enter image description here我有一种情况需要在两个不同的 id 处呈现两个不同的组件。像这样:

ReactDOM.render(
 <Component1/>,
document.getElementById('Coponent-id-1'));

和:

var deal_recommendations_id = document.getElementById('deal_recommendations_app');
       ReactDOM.render(
     <Component2/>,
    document.getElementById('Coponent-id-2'));

P.S This is different scenario than wrapping two component with a div and then rendering it on a single id

我实际上正在尝试这样做:

ReactDOM.render((
    <Provider store={store}>
        <Router history={hashHistory}>
            <Route path="/" component={WizardApp}> </Route>
             <Route path="/overview" component={DealRecommendation}></Route> 
             <Route path="/overview/:deal" component={DealRecommendation}></Route>         
            <Route path="/users/invite" component={ReferralApp}></Route> 
            <Route path="/adm/custodian" component={CustodianApp}></Route> 

        </Router>
    </Provider>
    ), document.getElementById('appRoot')
);
   var deal_recommendations_id = document.getElementById('deal_recommendations_app');
ReactDOM.render(
 <DealRecommendation/>,
deal_recommendations_id);

P.P.S 在正常情况下,它工作正常,如答案所示。 就我而言,在 deal_recommendations_idLinks ( react 链接)已加载。当我点击其中任何一个时,我收到一条错误消息:

Link.js:95 Uncaught TypeError: Cannot read property 'pushState' of undefined

这是完整的片段:

   import React, { Component } from 'react';
import ReactDOM from "react-dom";

import { Provider } from 'react-redux';
import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk';

import rootReducer from './reducers';

// import App from './components/App';
import WizardApp from './components/WizardApp';
import DealRecommendation from './components/dealRecommendation';
import ReferralApp from './components/referral/ReferralApp';
import CustodianApp from './components/admin/custodian/CustodianApp';
import { Router, Route, IndexRoute, Link, browserHistory, hashHistory } from 'react-router'

const store = createStore(rootReducer,compose(
    applyMiddleware(thunk),
    window.devToolsExtension ? window.devToolsExtension() : f => f
));



ReactDOM.render((
    <Provider store={store}>
        <Router history={hashHistory}>
            <Route path="/" component={WizardApp}> </Route>
             <Route path="/overview" component={DealRecommendation}></Route> 
             <Route path="/overview/:deal" component={DealRecommendation}></Route>         
            <Route path="/users/invite" component={ReferralApp}></Route> 
            <Route path="/adm/custodian" component={CustodianApp}></Route> 

        </Router>
    </Provider>
    ), document.getElementById('appRoot')
);

var deal_recommendations_id = document.getElementById('deal_recommendations_app');
ReactDOM.render(
 <DealRecommendation/>,
deal_recommendations_id);

查看快照。上面的 div 工作正常(在这种情况下,this.props.params 也被填充)。但是,我认为较低的 div 甚至在 <Routers> 之前就已经初始化了。被定义是导致我认为的问题。 (在这种情况下,this.props.params 将作为 undefined 出现)

--------------------DealRecommendation.js------------------------ ----------

import React from "react";
import ReactDOM from "react-dom";
import { Router, Route, IndexRoute, Link, browserHistory, hashHistory } from 'react-router';
import { createHistory } from 'history';
import RouterTabs from "./dealsOfInterest/routerTabs"
import '../style/deal_recommendation.css';


export default class DealRecommendation extends React.Component{

  constructor(){
    super();
  }


  render(){
    if(this.props.params!=undefined){
    if(this.props.params.deal==="rec_act"){
       return(
        <div className="deal_data_wrapper">
          <h3>Deals of Interest</h3>
          <RouterTabs/>
          <h2>this is activity</h2>
        </div>
        )  
    }

    else if(this.props.params.deal==="deal_news"){
         return(
        <div className="deal_data_wrapper">
          <h3>Deals of Interest</h3>
          <RouterTabs/>
           <h2>This is Deal_news</h2>
        </div>
        )  

    }
    else{

         return(
        <div className="deal_data_wrapper">
          <h3>Deals of Interest</h3>
          <RouterTabs/>
           <h2>This works too</h2>
        </div>
        )  

      }
    }

    else{
         return(
        <div className="deal_data_wrapper">
          <h3>Deals of Interest</h3>
          <RouterTabs/>

          <h2>This doesn't work</h2>
        </div>
        )  
    }

  }
}

最佳答案

在一个脚本中使用两个 ReactDOM.render() 是完全没问题的。

看下面的例子

var Hello = React.createClass({
  render: function() {
    return <div>Hello {this.props.name}</div>;
  }
});

ReactDOM.render(
  <Hello name="World" />,
  document.getElementById('container')
);
var HelloAgain = React.createClass({
  render: function() {
    return <div>Hello {this.props.name}</div>;
  }
});

ReactDOM.render(
  <HelloAgain name="World again" />,
  document.getElementById('another-container')
);

JSFIDDLE

引用以下文章

React Forum , SO POST

在你的情况下

var deal_recommendations_id = document.getElementById('deal_recommendations_app');
ReactDOM.render(
 <DealRecommendation/>,
document.getElementById('deal_recommendations_id'));

deal_recommendation_id 已经是一个 DOM 元素而不是一个 id,您不需要再次使用 document.getElementById。像下面这样使用它

var deal_recommendations_id = document.getElementById('deal_recommendations_app');
ReactDOM.render(
 <DealRecommendation/>,
deal_recommendations_id);

编辑:

据我所知,您需要删除 dealrecommendation 的冗余路由

ReactDOM.render((
    <Provider store={store}>
        <Router history={hashHistory}>
            <Route path="/" component={WizardApp}> </Route> 
             <Route path="/overview/:deal" component={DealRecommendation}></Route>         
            <Route path="/users/invite" component={ReferralApp}></Route> 
            <Route path="/adm/custodian" component={CustodianApp}></Route> 

        </Router>
    </Provider>
    ), document.getElementById('appRoot')
);
   var deal_recommendations_id = document.getElementById('deal_recommendations_app');
ReactDOM.render(
 <DealRecommendation/>,
deal_recommendations_id);

关于reactjs - 在两个不同的 ids 渲染两个组件 - React,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39696434/

相关文章:

javascript - window.location.href 与 history.pushState - 使用哪个?

reactjs - React router 和 this.props.children - 如何将状态传递给 this.props.children

reactjs - react 使用历史: Hooks can only be called inside the body of a function component

javascript - 在 React + Redux.js 应用程序中,在 Provider 组件之外操作 DOM 元素的正确方法是什么?

javascript - 在 Draft JS 中实现自动完成但没有像 "trigger"这样的 "@"

php - 此 React 应用程序中的实际数据和演示数据不同

javascript - 获取和映射 react Js

javascript - wrappedComponentRef 未定义 - React Ant Design,表单组件

javascript - 在 React 中卸载组件时监听器不会被删除

javascript - 链接参数不会在 JSX 中呈现( react )