我知道还有很多其他的问题答案,它们与做出反应中的动态成分有关。 但是在我们的项目中,有一个不同的要求。
假设UI模块中包含以下组件:
component1:
component2:
component3:
component1:
全新的自定义组件2:
component3:
component1:
component2:
component3不需要并已完全删除
需要支持。我坚持这一要求。
答案 0 :(得分:0)
在React中有多种方法可以实现这一目标。 主要问题是您是否可以更改这些组件的代码。
如果您不能: 您将必须通过应用著名的“渲染劫持”版本来根据客户需求创建新组件。
如果需要使用合成(出于各种原因,首选使用合成),则需要使用一个高阶组件(HOC)来替换原始的render方法。 这是一个链接,但是如果您搜索该词,则会找到更多选择。 https://blog.callstack.io/sweet-render-hijacking-with-react-bb2b81d8d9be
如果您不介意并且只需要快速工作,则可以扩展Component1类,编写一个新的render方法,然后跳过不需要增强的方法。
例如
class Component1v1 extends Component1 {
render() {
return(
{'My old and My new stuff'}
);
}
}
如果您可以编辑现有组件,则可以通过多种方法来实现。
选项1: 条件渲染
不是我的茶,但在某些情况下是有道理的: 例如
class Component1 extends React.Component {
...
render() {
return(
<input1/>
<input2/>
{customer2 && <input3_cust2/> : <input3/>}
);
}
}
通常,没有必要为每个客户的每个组件进行编辑,因此我将使用一个包装器组件,该组件可以渲染其他组件并增强其功能。据我所知,最好将大多数处理留给包装器以保持一致。
选项2: 包装带额外的孩子
例如
class Component1 extends React.Component {
render() {
return(
<div>
<input1 onChange={this.props.onChange}/>
<input2 onChange={this.props.onChange}/>
{...this.props.children}
</div>
);
}
}
class Wrapper extends React.Component {
handleChange(e) {
return null;
}
render() {
return(
<Component1 onChange={this.handleChange}>
<input3 onChange={this.handleChange}/>
</Component1>
);
}
}
请记住,这是伪代码,没有修复程序就无法工作
无论哪种方式,您都可以为每个包装创建包装,也可以为所有包装创建一个包装。您将与客户相关的所有字段作为“孩子”传递。
正如我之前提到的,根据客户端需要修改的组件没有太大意义,您可能需要花一些时间以适合您的方式对视图层和逻辑进行分组和拆分。这意味着您需要重新定义组件。