Using ReactJS with AngularJS Using ReactJS with AngularJS reactjs reactjs

Using ReactJS with AngularJS


Already @Simon Smith mentioned why the error occour React.renderComponent expect second argument but the way you play DOM manipulation inside controller is not appropriate. In AngularJs DOM manipulation should be in directive. Lets see how it could be

From Facebook's React vs AngularJS: A Closer Look blog

React components are far more powerful than Angular templates; they should be compared with Angular's directives instead.

Bottom of this blog Using React and AngularJS together section you can see how angular and react can play together.

From react website

React components implement a render() method that takes input data and returns what to display.

In angularjs components are rendered by directive

See this plunker where I integrate angularjs and react.

In react-example.js I have created virtual dom element

var Hello = React.createClass({  render: function() {    return React.DOM.div({}, 'Hello ' + this.props.name);  }});

And myMessage directive render the virtual dom

React.renderComponent(Hello({name: scope.myModel.message}), document.getElementById('example'));

Where virtual dom's name property will bind with scope.myModel.message


To use React in my controller, i do this

 myApp.controller(function($scope){        $scope.myComponent = {};        $scope.myComponent.setState({data: "something"});    });

and in my React component:

window.myComponent = React.createClass({    getInitialState: function(){        return {           data:''        }    },    componentWillMount: function(){       var scope = this.props.scope;           scope.myComponent = this;    },    render:func .....});

I'm using the ngReact directive from David Chang, which passes the $scope as a property into a component. So now you can call setState from your controller, forcing the react component to re-render :)

I have a bigger example of above in my React-Sandbox


I would consider doing the integration via a directive as that is often the recommended approach for integrating non angular code with angular.

Here is an example:

angular.module('app').directive('greeting',[function(){    return {        restrict:'AE',        scope:{name:'@'},        link: function (scope, elem, attrs){            var GreetingSection = React.createClass({displayName: 'Greeting',                render: function() {                    var message = "Good morning " + this.props.data.name + ", how are you?";                    return React.createElement('div', {className: "greeting"},message);                }            });            React.renderComponent(GreetingSection({data:scope}), elem[0]);        }    };}]);

More info here (link died; points to archive.org copy):
http://www.syntaxsuccess.com/viewarticle/547bbd04fa0710440b45e41c