javascript - 如何在CxJS中制作功能组件?

标签 javascript reactjs cxjs

如果我们可以将多个 Cx 组件组合成一个功能组件,该组件接受多个参数作为 JSX 属性,并且可以拥有自己的嵌套(子)组件,那将非常有帮助。

<LoadingOverlay loading={bind('$page.loading')} >
    <Grid />
</LoadingOverlay/>

创建自定义 Cx 组件时,通常我们需要创建一个类来扩展一些基本组件并实现某些预定义方法,这增加了过程的复杂性。

这是 LoadingOverlay 的一种可能实现:

class LoadingOverlay extends PureContainer {

    declareData() {
        super.declareData(...arguments, {
            loading: undefined
        });
    }

    render (context, instance, key) {
        let {data} = instance;
        return <div key={key} className="cxb-loading-overlay-container">
            {this.renderChildren(context, instance)}
            {data.loading && <div className="cxe-loading-overlay">
                <div className="cxe-loading-indicator">
                    {Icon.render('loading', { 
                            style: {
                                width: '24px', 
                                height: '24px',
                                position: 'relative',
                                top: '6px' 
                            } 
                        })
                    } 
                    Loading...
                </div>
            </div>}
        </div>;
    }
}

对于上面的示例,LoadingOverlay 必须继承于 PureContainer 并实现 declareDatarender 方法。 我希望能够使用类似于 React 的无状态功能组件的东西,如下所示:

const LoadingOverlay = (props) => {

    return <div className="cxb-loading-overlay-container">
        {props.children}
        {data.loading && <div className="cxe-loading-overlay">
            <div className="cxe-loading-indicator">
                {Icon.render('loading', { 
                        style: {
                            width: '24px', 
                            height: '24px',
                            position: 'relative',
                            top: '6px' 
                        } 
                    })
                } 
                Loading...
            </div>
        </div>}
    </div>;

}

这在 CxJS 中可能吗?

最佳答案

CxJS 允许将 React 组件与 CxJS 组件混合,因此您的第二个示例应该可以工作,只是您应该使用 props.loading 而不是 data.loading。 React 组件可以定义为功能性无状态组件,也可以定义为扩展 React.Component 基类(或 CxJS 中的 VDOM.Component)的 ES6 类。

CxJS 最近获得了对 CxJS functional components 的支持,这可能是此示例的最佳选择:

const LoadingOverlay = ({ loading, children }) => (
  <cx>
    <div className="cxb-loading-overlay-container">
      {children}
      <div className="cxe-loading-overlay" visible={loading}>
        <div className="cxe-loading-indicator" ws>
          <Icon
            name="loading"
            style="width:24px;height:24px;position:relative;top:6px"                        
          />
          Loading...
        </div>
      </div>
    </div>;
  </cx>
);

关于javascript - 如何在CxJS中制作功能组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44824041/

相关文章:

javascript - Webhoster 插入了一个破坏我的代码的 javascript 如何删除它?

javascript - 通过html表单旋转tabindex

javascript - 单击侧边栏时未调用 onClick

javascript - 如何在 CxJS 中为 onWheel 事件添加事件事件监听器?

javascript - Accordion 组如何修改代码

javascript - Angular $http.get 总是改变 JSON 中的顺序

javascript - 有没有办法让js逐行执行这个脚本

reactjs - React 子组件不会重新渲染状态更改

javascript - Cx 框架 : How to access a DOM element in Cx?

javascript - 如何在 Cx 的字段值表达式中使用自定义全局函数?