【问题标题】:Can we integrate react component into Aurelia project?我们可以将 React 组件集成到 Aurelia 项目中吗?
【发布时间】:2017-09-19 00:17:12
【问题描述】:

我创建了一个 react 组件并使用 webpack 构建它并部署在服务器上。我想将此组件集成到 Aurelia 项目中。

我尝试使用下面的 npm 模块: https://www.npmjs.com/package/aurelia-react-loader

在上面提到的模块中,组件名称需要传递到 html 文件中。就像示例中的 my-react-component.js 正在传递到 html 文件中。

但我的 React 组件正在使用以下代码加载到 html 标记的根目录中:

    import React from 'react';
    import ReactDOM from 'react-dom';
    import App from './App';
    ReactDOM.render((
      <App/>
    ), document.getElementById('root'));

在运行 webpack 模块之后,它会创建一个名为 index_bundle.js 文件的 JavaScript 文件。这里导入的 App 模块是主要的 js 组件。它通过 ReactDOM 渲染到根元素上的 index.html 中。

所以我不确定,我将如何将 React 组件链接或 url 集成到 Aurelia 应用程序中?

如果您有任何疑问,请告诉我。我可以详细解释一下。

提前致谢。 哈里什

【问题讨论】:

  • 聚会有点晚了,但我已经用打字稿建立了一个aurelia-skeleton 并在不久前做出了反应。也许它仍然对你有用。

标签: reactjs aurelia


【解决方案1】:

是的,将 React 组件集成到 Aurelia 应用程序中真的很容易。在这里查看我的项目:https://github.com/ashleygrant/aurelia-loves-react

我什至没有使用你提到的加载器插件。

以下是在 Aurelia 自定义元素中包装第三方 React 组件的方法:

import React from 'react';
import ReactDOM from 'react-dom';
import ReactDatePicker from 'react-datepicker';
import { noView, bindable, inject } from 'aurelia-framework';

@noView(['react-datepicker/react-datepicker.css'])
@inject(Element)
export class DatePicker {
  @bindable selectedDate;
  @bindable onChange;

  constructor(element) {
    this.element = element;
  }

  selectedDateChanged() {
    this.render();
  }

  render() {
    ReactDOM.render(
      <ReactDatePicker
        selected={this.selectedDate}
        onChange={date => this.onChange({ date: date })}
      />,
      this.element
    );
  }

  // How to use native DOM events to pass the changed date
  /*render() {
    ReactDOM.render(
      <ReactDatePicker
        selected={this.selectedDate}
        onChange={date => {
          let event = new CustomEvent('change', { 'detail': date });
          // Dispatch the event.
          this.element.dispatchEvent(event);
        }
        }
      />,
      this.element
    );
  }*/
}

下面是在使用作为 Aurelia 项目一部分的自定义反应组件时如何做到这一点:

import React from 'react';
import ReactDOM from 'react-dom';
import { noView, bindable, inject } from 'aurelia-framework';
import FormattedDate from '../react-components/formatted-date';

@noView()
@inject(Element)
export class ReactDate {
  @bindable date;
  @bindable format = 'dddd, MMMM D, YYYY';

  constructor(element) {
    this.element = element;
  }

  dateChanged() {
    this.render();
  }

  formatChanged() {
    this.render();
  }

  render() {
    ReactDOM.render(
      <FormattedDate 
        date={this.date}
        format={this.format}
      />,
      this.element
    );
  }
}

如您所见,它非常简单。我喜欢手工而不是使用加载器,因为我可以为每个属性设置数据绑定,因此它以更“Aurelia-ey”的方式工作。

【讨论】:

  • 非常感谢。我正在调查您的项目,并将尝试在我的项目中实施。如果有任何问题,我会尽快回复您。
  • 嗨,在你的项目中,我看到了 react-date.js 文件。在那里你导入了 aurelia-framework。需要添加 React 组件吗?我的组件主文件是:
  • 从'react'导入反应;从“react-dom”导入 ReactDOM;从'./App'导入应用程序;导出类 ReactComponent { constructor() { this.render(); } render() { console.log("调用 RENDER 函数") ReactDOM.render(( ), document.getElementById('root'));我正在像这样集成到 Aurelia 中:
  • 但是我看到渲染函数没有调用。甚至登录渲染功能也没有出现在日志部分。请让我知道我在这里做错了什么?
  • 您无法渲染尚未在 DOM 中放置位置的内容。所以不要在构造函数中调用render,在attached回调中调用。
猜你喜欢
  • 2016-04-22
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
相关资源
最近更新 更多