React 컴포넌트를 동적으로 렌더링


78

React JSX에서는 다음과 같은 작업을 수행 할 수 없습니다.

render: function() {
  return (
    <{this.props.component.slug} className='text'>
      {this.props.component.value}
    </{this.props.component.slug}>
  );
}

구문 분석 오류가 발생합니다. Unexpected token {. 이것은 React가 처리 할 수있는 것이 아닙니까?

내부적으로 저장된 값에 this.props.component.slug유효한 HTML 요소 (h1, p 등)가 포함 되도록이 구성 요소를 설계하고 있습니다. 이 작업을 수행 할 수있는 방법이 있습니까?

답변:


96

구성 요소 슬러그를 중괄호로 묶어서는 안됩니다.

var Hello = React.createClass({
    render: function() {
        return <this.props.component.slug className='text'>
            {this.props.component.value}
        </this.props.component.slug>;
    }
});

React.renderComponent(<Hello component={{slug:React.DOM.div, value:'This is my header'}} />, document.body);

다음은 작동하는 바이올린입니다. http://jsfiddle.net/kb3gN/6668/

또한 이러한 종류의 오류를 디버깅하는 데 유용한 JSX 컴파일러를 찾을 수 있습니다. http://facebook.github.io/react/jsx-compiler.html


16
내가 방금 해결 한 한 가지 문제는 다른 변수가 인식되도록하려면 점을 제공해야한다는 것입니다. 즉 var page; <page></page>작동 var page = { component: component }; <page.component></page.component>하지 않는 반면 작동합니다.
marksyzm

5
React는 변수가 대문자이거나 점 표기법이있는 경우 사용자 지정 요소로 처리하고 그렇지 않으면 HTML 요소로 처리합니다. Ie <Page> </ Page>도 작동합니다
bebbi

작동하려면 React.DOM.div를 'div'로 바꿔야했습니다.
galki

3
당신의 마음에 계속 변수가 구성 요소를 보유해야 자체와 하지 와 같은 구성 요소의 이름 만 문자열을 .
totymedli

22

nilgun이 이전에 지적했듯이 구성 요소 슬러그는 중괄호로 감싸서는 안됩니다.

변수에 저장하기로 결정한 경우 대문자로 시작해야합니다.

다음은 그 예입니다.

var Home = React.createClass({
  render: function() {
    return (
      <div>
        <h3>This is an input</h3>
        <CustomComponent inputType="input" />
        <h3>This is a text area</h3>
        <CustomComponent inputType="textarea" />
      </div>
    );
  }
});

var CustomComponent = React.createClass({
  render: function() {
    // make sure this var starts with a capital letter
    var InputType = this.props.inputType;
    return <InputType />;
  }
});

React.render(<Home />, document.getElementById('container'));

다음은 작동하는 바이올린입니다 : https://jsfiddle.net/janklimo/yc3qcd0u/


락 !! 변수 이름은 대문자로 시작해야합니다. 이것은 이상하지만 그것이 무엇인지입니다.
아프 탑 Naveed

5

렌더링 된 실제 구성 요소를 주입하려는 경우 이와 같은 작업을 수행 할 수 있습니다. 이는 테스트에 매우 편리하거나 어떤 이유에서든 렌더링 할 구성 요소를 동적으로 주입하려는 것입니다.

var MyComponentF=function(ChildComponent){
    var MyComponent = React.createClass({
        getInitialState: function () {
            return {
            };
        },
        componentDidMount: function () {
        },
        render: function () {
            return (
                <div className="MyComponent">
                    <ChildComponent></ChildComponent>
                </div>
            );
        }
    });
    return MyComponent;
};

var OtherComponentF=function(){
    var OtherComponent = React.createClass({
        getInitialState: function () {
            return {
            };
        },
        componentDidMount: function () {
        },
        render: function () {
            return (
                <div className="OtherComponent">
                    OtherComponent
                </div>
            );
        }
    });
    return OtherComponent;
};

var AnotherComponentF=function(){
    var AnotherComponent = React.createClass({
        getInitialState: function () {
            return {
            };
        },
        componentDidMount: function () {
        },
        render: function () {
            return (
                <div className="AnotherComponent">
                    AnotherComponent
                </div>
            );
        }
    });
    return AnotherComponent;
};

$(document).ready(function () {
    var appComponent = MyComponentF(OtherComponentF());

    // OR
    var appComponent = MyComponentF(AnotherComponentF());

    // Results will differ depending on injected component.

    ReactDOM.render(React.createElement(appComponent), document.getElementById("app-container"));
});

4

편집 : 어쩌면 /** @jsx React.DOM */js의 시작 부분에 추가하는 것을 잊었 습니까?

React.DOM그래도 사용할 수 있습니다 .

render: function() {
  return React.DOM[this.props.component.slug](null, this.props.component.value);
}

http://jsbin.com/rerehutena/2/edit?html,js,output

저는 React 전문가는 아니지만 모든 구성 요소가 처음에 특정 태그로 구성되어야한다고 생각합니다. 따라서 명확한 목적 자체를 제시 할 수 있습니다.


0

나를위한 해결책은 가져온 구성 요소를 변수 (CapitalCase 포함)에 할당 한 다음 해당 변수를 렌더링하는 것이 었습니다.

예:

import React, { Component } from 'react';
import FooComponent from './foo-component';
import BarComponent from './bar-component';

class MyComponent extends Component {
    components = {
        foo: FooComponent,
        bar: BarComponent
    };

        //this is the most important step
       const TagName = this.components.foo;

    render() {
       return <TagName />
    }
}
export default MyComponent;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.