【发布时间】:2017-01-03 12:00:06
【问题描述】:
我有一个字符串需要参数化,例如“你好 {name},你好吗?”。我想用一个变量替换花括号和里面的文本,然后在我的 React 组件中呈现它,但我还需要通过将变量文本包装在 span/strong 标签中来突出显示和加粗该文本,例如期望的最终结果
Hello <span class="text-info"><strong>Dave</strong></span>, how are you?
我正在使用 React/JSX,我知道如何使用 String.replace 替换花括号和其中的文本,然后渲染它,例如
// This string with the placeholder curly braces would be received from an API call to a server. Only set here for demonstrative purposes
let string = 'Hello {name}, how are you?'
let name = 'Dave' // Likewise would not be set manually here, it's held in a redux store
let greeting = string.replace(/{(.*?)}/, name);
// This renders the greeting as you'd expect e.g. <p>Hello Dave, how are you?</p>
return (
<p>{greeting}</p>
)
但是,如果我尝试用 span 元素替换花括号,它会错误地使用 [object Object] 而不是我的参数呈现
// ...rest of stateless Component.jsx
let greeting = string.replace(/{(.*?)}/, <span>{name}</span>);
// This renders the HTML <p>Hello [object Object], how are you?</p>
return (
<p>{greeting}</p>
)
我认为这一定与 React 逃避某些东西有关,但老实说,这完全是猜测。有什么想法可以实现所需的功能吗?
【问题讨论】:
-
您使用 String.replace 而不做这样的事情有什么原因吗? jsfiddle.net/e851a1ua
-
这是因为字符串和名称变量来自服务器的单独调用。所以名称保存在用户对象的 redux 存储中。并且文本也使用占位符存储在数据库中的服务器上。所以我需要用商店的用户信息替换占位符。问题澄清
-
转译后,
<span>{name}</span>将被替换为返回对象的React.createElement("span", null,{name})的结果,这就是结果字符串显示为[object Object]的原因。 -
@user1858268 是的,我认为可能会发生类似的事情,您知道实现所需功能的任何替代策略吗?
-
你可以替换为
"<span>" + {name} + "</span>",然后使用setInnerHtml进行渲染。但可能还有其他方法。
标签: javascript string reactjs jsx