【发布时间】:2018-07-14 22:08:20
【问题描述】:
首先,我主要是 AngularJS 开发人员,最近切换到 React,我决定将我之前开发的 Angular Web 应用程序转换为 React 应用程序。我对组件ExpressiveText 有一点问题,该组件在字符串中搜索与列表对象上的属性匹配的内容,并在其位置插入组件TriggerModal,单击该组件会触发具有更详细信息的模式。所以传入ExpressiveTest的属性是:text、tags和tagsProperty。
text 是一个字符串(即"My search string")
tags 是一个对象数组(即[{id: 1, name: 'my', data: {...}}, {id: 2, name: 'string', data: {...}}]
tagsProperty 是要作为“标签”搜索的属性名称(即name)
我与this issue 一起尝试制定如何解决此问题的想法。我提到我来自 angular 的原因是因为我之前创建的组件只是使用了 text.replace(regex, match => <trigger-modal data={tags[i]} />) 之类的东西,然后使用 angulars $compile 函数在文本中呈现组件。使用反应似乎不可能。这是我在 ExpressiveText 组件中尝试过的:
class ExpressiveTextComponent extends React.Component {
constructor (props) {
super(props);
this.filterText = this.filterText.bind(this);
}
filterText () {
let text = this.props.text;
this.props.tags.map(tag => {
const regex = new RegExp(`(${tag[this.props.tagsProperty]})`, 'gi');
let temp = text.split(regex);
for(let i = 1; i < temp.length; i+=2){
temp[i] = <TriggerModal data={tag} label={tag[this.props.tagsProperty]} />;
}
text = temp;
});
return text;
}
render () {
return (
<div className={this.props.className}>{this.filterText()}</div>
);
}
}
这适用于第一个标签。它的问题是,一旦它到达第二个标签上的map,text 就是一个数组。我尝试添加一个条件来检查text 是否是一个数组,但是问题变成了text 数组变得嵌套并且在下一次迭代中不起作用。我很难考虑如何处理这个问题。我也尝试过使用text.replace(...) 的dangerouslySetInnerHTML,但这也不起作用,只是渲染[object Object] 来代替组件。非常感谢任何帮助或建议,我不得不说这可能是我切换到 React 后遇到的唯一主要问题,否则它非常简单。
编辑:由于我有一个问题要求具有给定输入和更多说明的预期输出,因此我正在寻找的是一个具有此输入的组件:
<ExpressiveText text="my text" tags={{id: 1, name: 'text'}} tagsProperty="name" />
会渲染
<div>my <TriggerModal label="text" data={...} /></div>
带有功能性TriggerModal 组件。
【问题讨论】:
-
你到底想做什么?给定一些输入,你能添加一些预期的输出吗?
-
我不确定如何更好地解释...给定一个字符串 (
text),该组件应该搜索多个关键字(来自tags的对象,使用@987654350 定义的属性@) 并将这些关键字替换为 React 组件。问题是让反应组件呈现。这一切都发生在filterText方法中。这有帮助吗? -
所以,给定这个输入:
<ExpressiveText text="my text" tags={{id: 1, name: 'text'}} tagsProperty="name" />,预期渲染的内容本质上是<div>my <TriggerModal label="text" /></div>。
标签: javascript arrays angularjs reactjs replace