代码之家  ›  专栏  ›  技术社区  ›  Teoman shipahi

未调用Typescript React组件DidMount

  •  2
  • Teoman shipahi  · 技术社区  · 9 年前

    我正在尝试用typescript/react运行一些示例,但出于某种原因componentDidMount函数没有被触发,我想将我的AJAX逻辑移到那里。

    下面是我的代码。

    var app = new MyAppApplication();
    
    namespace MyAppApp.Components {
        // props?: P, context?: any
        export class HomePageView extends React.Component<any, any> {
            constructor(props, context) {
                super(props, context);
                this.state = null;
                // calling here
                console.log("constructor");
            }
            public componentDidMount() {
            // not calling here
                console.log("componentDidMount");
            }
            public render() {
                var view = this.state.map((item, index) =>
                    <div className="MyAppBoxContainer" key={index}>
                        <a href={item.Href}>{item.Title}</a>
                        </div>
                );
                return (<div>{view}</div>);
            }
    
        }
    }
    
    
    app.getHomeContentTitles().then(result => {
        //app.logger.info(this, result);
        var main = new MyAppApp.Components.HomePageView("1", result);
        main.state = result;
        var mainView = main.render();
        ReactDOM.render(mainView, document.getElementById(app.templateContainer));
    }).catch(err => {
        app.logger.error(this, err);
    });
    

    我错过了什么吗?

    1 回复  |  直到 9 年前
        1
  •  5
  •   rossipedia    9 年前

    不要调用组件的 render() 方法。另外,不要自己实例化它。此外,将道具传递给组件,而不是直接设置状态:

    更改此设置:

    var main = new MyAppApp.Components.HomePageView("1", result);
    main.state = result;
    var mainView = main.render();
    ReactDOM.render(mainView, document.getElementById(app.templateContainer));
    

    为此:

    ReactDOM.render(
        <MyAppApp.Components.HomePageView result={result} />,
        document.getElementById(app.templateContainer)
    );
    

    如果不支持JSX,则可以执行以下操作:

    ReactDOM.render(
        React.createElement(MyAppApp.Components.HomePageView, { result: result}),
        document.getElementById(app.templateContainer)
    );
    

    然后通过访问结果 this.props.result 而不是 this.state :

    public render() {
        return (
            <div>
                {this.props.result.map((item, index) =>
                    <div className="MyAppBoxContainer" key={index}>
                        <a href={item.Href}>{item.Title}</a>
                    </div>
                )}
            </div>
        );
    }