我可以在对象文字中添加一些字符串吗?
如果我height: 'calc(100% - ' + String(this.padding) + 'px * 2)'
,则Chrome会向我显示以下错误消息。
[ProjectContainer.js:15]未捕获的TypeError:无法读取属性 '填充'未定义的
var styles = {
root: {
display: 'flex',
flexWrap: 'wrap',
textAlign: 'left',
padding: 10,
height: 'calc(100% - ' + String(this.padding) + 'px * 2)',
width: 'calc(100% - 10px * 2)',
overflowY: 'scroll'
}
}
但是,如果我将其设为函数,则不会显示任何错误消息,但css似乎无法正常工作。这可能是因为内联式系统不会将其称为函数而是变量。
var styles = {
root: {
display: 'flex',
flexWrap: 'wrap',
textAlign: 'left',
padding: 10,
height: function() {return 'calc(100% - ' + String(this.padding) + 'px * 2)'},
width: 'calc(100% - 10px * 2)',
overflowY: 'scroll'
}
}
将身高设为'calc(100% - 10px * 2)'
的最佳方式是什么?
答案 0 :(得分:4)
如评论中所述,在定义对象文字时,不能使用this
来引用对象文字。相反,它将引用当前代码范围中的全局this
或this
。基本上,在您仍然定义对象文字时,不能使用对象文字的属性,之后需要这样做:
var styles = {
root: {
display: 'flex',
flexWrap: 'wrap',
textAlign: 'left',
padding: 10,
height: '', // Optional
width: 'calc(100% - 10px * 2)',
overflowY: 'scroll'
}
}
styles.root.height = 'calc(100% - ' + String(styles.root.padding) + 'px * 2)';
console.log(styles);
答案 1 :(得分:1)
你可以试试这个
var styles = {
root: {
display: 'flex',
flexWrap: 'wrap',
textAlign: 'left',
padding: 10,
width: 'calc(100% - 10px * 2)',
overflowY: 'scroll'
},
init: function() {
this.root.height = 'calc(100% - ' + String(this.root.padding) + 'px * 2)';
delete this.init;
return this;
},
}.init()
答案 2 :(得分:1)
你可以这样做:
var styles = (function() {
var padding = '10';
return {
root: {
display: 'flex',
flexWrap: 'wrap',
textAlign: 'left',
padding: +padding,
height: 'calc(100% - ' + padding + 'px * 2)',
width: 'calc(100% - 10px * 2)',
overflowY: 'scroll'
}
})();
这使用了几种有趣的Javascript技术,例如:
'10'
强制转换为数字这样做不仅可以在单个表达式中完成,而且更易于阅读和理解。
您可以修改它,以便填充值可以从外部传入,几乎没有新工作:
var styles = (function(padding) {
var padding = padding ? padding : '10';
return {
root: {
display: 'flex',
flexWrap: 'wrap',
textAlign: 'left',
padding: +padding,
height: 'calc(100% - ' + padding + 'px * 2)',
width: 'calc(100% - 10px * 2)',
overflowY: 'scroll'
}
})(padding);
答案 3 :(得分:0)
在声明期间,您无法在对象文字中使用this
来正确引用。 JavaScript中的this
用于函数范围。
下面的示例显示了您的问题的可能解决方案。
您基本上在函数范围中定义padding
并在对象文字声明中检索它。
在大多数情况下,其值取决于函数的大小 调用。它不能在执行期间通过赋值来设置,它可能是 每次调用函数时都不同。 More info on this here
function foo() {
this.padding = 10; // declare it only once
var styles = {
root: {
display: 'flex',
flexWrap: 'wrap',
textAlign: 'left',
padding: this.padding,
height: 'calc(100% - ' + String(this.padding) + 'px * 2)',
width: 'calc(100% - 10px * 2)',
overflowY: 'scroll'
}
};
console.log(styles.root);
};
foo();