从ReactJS外部渲染组件

Ist*_*med 9 node.js express reactjs react-jsx react-async

这里:

"在React之外获取React Component实例句柄的唯一方法是存储React.render的返回值."

我需要在React之外渲染一个React组件,我将在下面提到它的原因.

在我的node.js,expressJS应用程序中,我使用'react-router-component''react-async'.

在app.js中 - 应该运行的文件,

    var url=require('url');   
    var App=require('./react/App.jsx');
    var app = express();
    app.get('*',function(req,res){


    //}); SEE EDIT 1 BELOW

    var path = url.parse(req.url).pathname;
                ReactAsync.renderComponentToStringWithAsyncState(App({path:path}),function(err, markup) {
    res.send('<!DOCTYPE html>'+markup);

          });
   });
Run Code Online (Sandbox Code Playgroud)

在App.jsx中,

   PostList = require('./components/PostList.jsx');
   var App = React.createClass({
   render: function() {
        return (

           <html>
           <head lang="en">
           </head>
        <body>
        <div id="main">

        <Locations path={this.props.path}>

          <Location path="/" handler={PostList} />
          <Location path="/admin" handler={Admin} />
        </Locations>


       <script type="text/javascript" src="/scripts/react/bundle.js"></script>
       <script type="text/javascript" src="/scripts/custom.js"></script>                 

        </body>
        </html>
        }); 
Run Code Online (Sandbox Code Playgroud)

bundle.js 是来自所有.jsx文件的浏览器化文件.

在PostList.jsx中,

    var PostList = React.createClass({

        mixins: [ReactAsync.Mixin],

        getInitialStateAsync: function(cb) {

           if(typeof this.props.prods==='undefined'){

            request.get('http://localhost:8000/api/cats_default', function(response) {

                    cb(null, {items_show:response.body});

                       });
                                                    }
        },

        setTopmostParentState: function(items_show){

          this.setState({
             items_show:items_show
                       });

         },

        render: function() {

        return (

              <div className="postList" id="postList">
              **// Things go here** 
              <div className="click_me" >Click me</div>
              </div>    
            }

    });


    PostListRender=function(cart_prods){

        var renderNow=function(){

            //return <PostList  cart_prods={cart_prods}></PostList>

             React.renderComponent(<PostList  cart_prods={cart_prods}></PostList>,document.getElementById('postList') );  
                                 };

         return {
           renderNow:renderNow
                }   
        };
    module.exports=PostList;
Run Code Online (Sandbox Code Playgroud)

在custom.js中:

$('.click_me').click(function(){

PostListRenderObj=PostListRender(products_cart_found);
PostListRenderObj.renderNow();

$('odometer').html('price');// price variable is calculated anyhow

});
Run Code Online (Sandbox Code Playgroud)

该页面显示良好.

编辑3开始

现在我想PostList在点击时渲染组件click_me div.

编辑3结束

但是当我点击click_me元素时,浏览器显示脚本忙,控制台显示

ReactJS - ReactMount:Root元素已从其原始容器中删除.新容器

并且Firebug日志限制超过了.

那么为什么我要在外部点击react.js进行渲染: 我必须在点击时运行jQuery Odomoeter插件click_me div.该插件不是作为节点中间件开发的,尽管它可以像安装中间件的方式安装,插件代码库也保存在node_modules文件夹中.

Edit2开始:

由于插件不是节点中间件,我不能require从内部节点.但是,我可以从内部节点执行click事件(代码未显示),并在那里运行以下代码:

$('odometer').html('price');// price variable is calculated anyhow
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我将浏览器中的插件包含在<script />标签中,并在浏览器bundle.js脚本之后添加浏览器.但是动画没有正确显示.所以我在客户端点击事件custom.js.

如果我不require将插件作为来自内部节点的中间件并且只是在浏览器化的JS文件之前将其包含在页面中并在React中执行单击事件,那么里程表动画就没有正确显示.

Edit2结束:

那么在PostListReact之外渲染React组件的方法是什么?

编辑1});是相当错误地放在那里

Bla*_*son 5

我无法理解您的问题描述,但这回答了标题问题:

如何在 React 之外渲染 React 组件?

MyComponent = require('MyComponent')

element = document.getElementById('postList');

renderedComp = ReactDOM.render(MyComponent,{...someProps},element); 

// => render returns the component instance.

$(document).on('something, function(){
   renderedComp.setState({thingClicked: true})
})
Run Code Online (Sandbox Code Playgroud)

在 React 内部你可以直接调用组件。