我需要动态加载React组件。
我从用户获取要加载为字符串的组件名称。我正在使用 webpack 。
如何动态加载组件,而不要使用静态import语句。似乎Require.Ensure
不评估表达式。我想要实现的是这样的事情。
require.ensure([ "./widgets/" + componentName ] ,(require) => {
let Component = require("./widgets/" + componentName);
});
但这似乎不起作用。
基本上,它可以归结为预先创建您将需要的所有块。然后,您只需要一种动态引用它们的方法。这是我基于的解决方案:
http://henleyedition.com/implicit-code-splitting-with-react-router-and-
webpack
这是我不使用React Router的方法(注意:我发现它与redux或动画没有很好的匹配):
//loader:
{
test: (folder)\/.*\.js,
include: path.resolve(__dirname, 'src')
loader: ['lazy?bundle', 'babel']
}
//dynamic usage within React component:
const My_COMPONENTS = {
ComponentA: require('./folder/ComponentA'),
ComponentB: require('./folder/ComponentB'),
}
class ParentComponent extends React.Component {
componentDidMount() {
My_COMPONENTS[this.props.name](component => this.setState({component}));
}
render() {
return <this.state.component />;
}
}
因此,结果是您正在动态渲染组件,但是是从一组静态的预先确定的可能性中进行的-同时,仅向客户端发送的内容不多于访问者实际感兴趣的部分。
另外,这是我做得很好的一个组件:
import React from 'react';
import Modal from './widgets/Modal';
export default class AjaxModal extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
Content: null
};
}
componentDidMount() {
if(this.props.show) {
this.loadContent();
}
}
componentWillReceiveProps({show}) {
if(show && !this.state.Content) {
this.loadContent(1200); //dont interfere with animation
}
}
loadContent(ms=0) {
setTimeout(() => {
this.props.requestLazyBundle(({default: Content}) => {
this.setState({Content});
});
}, ms);
}
render() {
let {Content} = this.state;
return (
<Modal title={this.props.title} {...this.props} loading={!Content}>
{Content ? <Content /> : null}
</Modal>
);
}
}
通过传递async require bundler函数this.props.requestLazybundle
,如下所示:
render() {
let requestLazyBundle = require('bundle?lazy&name=AnotherComponent!../content/AnotherComponent');
return (
<AjaxModal title="Component Name" {...props} requestLazyBundle={requestLazyBundle} />
);
}
问题内容: 我正在考虑构建一个Web应用程序,人们可以在其中安装插件。我希望插件能够定义将呈现到页面的React组件,而无需在安装插件后重新编译主JavaScript包。 所以这是我正在考虑的方法: 使用webpack 将主要的JavaScript与React作为外部库捆绑在一起。 也让插件作者使用React作为外部库来编译其组件。 这样,我只运行一个React实例。我可能可以对其他一些经常使用的
我试图根据组件的类型动态地渲染它们。 例如: 我尝试了这里提出的解决方案React/JSX动态组件名称 这在编译时给了我一个错误(使用browserify代替gulp)。它需要XML,而我使用的是数组语法。 我可以通过为每个组件创建一个方法来解决这个问题: 但这意味着我创建的每个组件都有一个新方法。必须有一个更优雅的解决方案来解决这个问题。 我对各种建议持非常开放的态度。
我已经用ReactJS和ES6进行了几天的实验,并创建了两个组件,即
问题内容: 我正在尝试为我的网站创建页面主题功能。我想使用单独的CSS文件在页面上动态加载相应的主题。 我正在使用此代码: 效果很好,但是如果CSS文件未加载,它不会返回任何信息。 加载时,有什么方法可以捕捉吗?也许通过使用ajax? 问题答案: 加载CSS文件(或其任何其他更改)时,Internet Explorer会触发一个事件。其他浏览器不会触发任何事件,因此您将必须手动检查样式表是否已加载
说明 调用方法: $.f2e.util.getScript(url,cache,fn); 函数说明: 加载js,并提供相关回调 参数说明: 参数名 类型 说明 备注 url string 地址 无 cache boolean 缓存 无 fn function 回调函数 无 脚本 <script> $.f2e.util.getScript(url,true,function(){
动态加载QML不同组成部分最简单的方法是使用加载元素项(Loader element)。它作为一个占位符项用来加载项。项的加载通过资源属性(source property)或者资源组件(sourceCompontent)属性控制。加载元素项通过给定的URL链接加载项,然后实例化一个组件。 加载元素项(loader)作为一个占位符用于被加载项的加载。它的大小基于被加载项的大小而定,反之亦然。如果加载