Ank*_*wal 5 javascript reactjs react-jsx
我可以在React JSX中使用dangerouslySetInnerHTML来清理字符串吗?要求是检查已清理的html字符串的长度,然后仅包括该组件.就像是
var SomeComponent = React.createClass({
render:function(){
return (
{this.props.htmlString.length > 0 ? <Child htmlString={this.props.htmlString} : null}
)
}
})
var Child = React.createClass({
render:function(){
return (
<p dangerouslySetInnerHTML={{__html: this.props.htmlString}}></p>
)
}
})
Run Code Online (Sandbox Code Playgroud)
一切正常,但失败了this.props.htmlString=' '.在这种情况下,长度> 0并且包括组件.所以我想在元素包含本身之前检查innerHTML的长度.
我遇到的一个可能的解决方案是:
var html = " ";
var div = document.createElement('div');
div.innerHTML = html; //check the length of innerHTML now
Run Code Online (Sandbox Code Playgroud)
但我正在寻找更清洁的反应类型.
正如您已经建议的,通过用 HTML 字符串填充 DOM 元素,可以轻松地将 HTML 字符串解析为纯文本。
function htmlToText(htmlString) {
const el = document.createElement('div');
el.innerHTML = htmlString;
return el.textContent;
}
Run Code Online (Sandbox Code Playgroud)
这会将您的标记转换为纯文本:
htmlToText(' ') === '\xa0' // non-breaking space character
Run Code Online (Sandbox Code Playgroud)
检查解析的文本是否不为空就很简单了:
htmlToText(' ').trim().length === 0
htmlToText(' FOO ').trim().length === 3
Run Code Online (Sandbox Code Playgroud)
没有“React 方式”可以做到这一点,因为如果您直接从字符串设置 HTML,则只有在实际注入 DOM 时才会解析。当然,您可以使用此工具来创建HOC:
const nonEmptyHtml = Component => props => {
const html = props.dangerouslySetInnerHTML;
if (html && !htmlToText(html).trim().length) {
return null;
}
return <Component {...props} />;
};
Run Code Online (Sandbox Code Playgroud)
用法:
const NonEmptyParagraph = nonEmptyHtml('p');
ReactDOM.render(<NonEmptyParagraph dangerouslySetInnerHTML={htmlString} />);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2462 次 |
| 最近记录: |