创建可定制的 "templates",用于 ReactJS 组件,无需
Creating customisable "templates", for use within ReactJS components, without
我有一个看起来像这样的组件:
var MyTemplatedComponent = React.createClass({
getDefaultProps: function () {
return {
discountValue: '10% off',
welcomeMessage: 'Want {{discountValue}} off your next order?'
};
},
getWelcomeMessage: function () {
return this.props.welcomeMessage.replace('{{discountValue}}', '<strong>'+this.props.discountValue+'</strong>');
},
render: function() {
return (
<p className='lead' dangerouslySetInnerHTML={{ __html: this.getWelcomeMessage() }} />
);
}
});
我们的目标是让我们的客户自定义 {{discountValue}}
以满足他们的喜好。然后我们要加粗渲染时的折扣值。
目前我发现唯一正确的方法是使用 dangerouslySetInnerHTML
,但感觉很危险!而且有点丑。
谁能想到更好的处理方法?
在这种情况下使用 dangerouslySetInnerHTML 并没有那么危险(因为 welcomeMessage 将由客户端编写)。但是,如果您担心客户端可能会搞砸并将用户输入放入欢迎消息中,只需在开始输入 HTML.
之前转义欢迎消息模板即可
以下转义码取自react itself:
var ESCAPE_LOOKUP = {
'&': '&',
'>': '>',
'<': '<',
'"': '"',
'\'': '''
};
var ESCAPE_REGEX = /[&><"']/g;
function escaper(match) {
return ESCAPE_LOOKUP[match];
}
function escapeTextForBrowser(text) {
return ('' + text).replace(ESCAPE_REGEX, escaper);
}
获得该功能后,您可以像这样修复 getWelcomeMessage 功能:
getWelcomeMessage: function () {
return escapeTextForBrowser(this.props.welcomeMessage).replace('{{discountValue}}', '<strong>'+this.props.discountValue+'</strong>');
},
我有一个看起来像这样的组件:
var MyTemplatedComponent = React.createClass({
getDefaultProps: function () {
return {
discountValue: '10% off',
welcomeMessage: 'Want {{discountValue}} off your next order?'
};
},
getWelcomeMessage: function () {
return this.props.welcomeMessage.replace('{{discountValue}}', '<strong>'+this.props.discountValue+'</strong>');
},
render: function() {
return (
<p className='lead' dangerouslySetInnerHTML={{ __html: this.getWelcomeMessage() }} />
);
}
});
我们的目标是让我们的客户自定义 {{discountValue}}
以满足他们的喜好。然后我们要加粗渲染时的折扣值。
目前我发现唯一正确的方法是使用 dangerouslySetInnerHTML
,但感觉很危险!而且有点丑。
谁能想到更好的处理方法?
在这种情况下使用 dangerouslySetInnerHTML 并没有那么危险(因为 welcomeMessage 将由客户端编写)。但是,如果您担心客户端可能会搞砸并将用户输入放入欢迎消息中,只需在开始输入 HTML.
之前转义欢迎消息模板即可以下转义码取自react itself:
var ESCAPE_LOOKUP = {
'&': '&',
'>': '>',
'<': '<',
'"': '"',
'\'': '''
};
var ESCAPE_REGEX = /[&><"']/g;
function escaper(match) {
return ESCAPE_LOOKUP[match];
}
function escapeTextForBrowser(text) {
return ('' + text).replace(ESCAPE_REGEX, escaper);
}
获得该功能后,您可以像这样修复 getWelcomeMessage 功能:
getWelcomeMessage: function () {
return escapeTextForBrowser(this.props.welcomeMessage).replace('{{discountValue}}', '<strong>'+this.props.discountValue+'</strong>');
},