2014-01-10 89 views
2

我移植从AngularJS下面的代码阵营:React.js:传递值中的属性

<div style="translate: translate({x}px, {y}px) scale({scale}) rotate({angle}deg)"}></div> 

我想:

<div style="translate: translate({this.state.x}px, {this.state.y}px) scale({this.state.scale}) rotate({this.state.angle}deg)"}></div> 

它失败,Parse Error: Line X: Unexpected token }

我想出的最好的是:

<div style={{transform: "translate(" + this.state.x + "px, " + this.state.y + "px) \ 
    scale(" + this.state.scale + ") \ 
    rotate(" + this.state.angle + "deg)"}}></div> 

这是一个很大的" + this.state.XXX + ",这是非常难以阅读。

有没有更好的方法呢?

回答

0

我想出了AngularJS风格的微模板功能。用例:

<div style={this.evalTpl("translate: translate({{x}}px, {{y}}px) scale({{scale}}) rotate({{angle}}deg)")}></div> 

实施:

evalTpl: function(str) { 
    var state = this.state; 
    return str.replace(/{{.+?}}/g, function(name) { 
     name = name.slice(2, -2).trim(); 
     var value = state[name]; 
     if (typeof value === 'undefined' || value === null || (!value && isNaN(value))) { 
      throw new Error('this.state[' + JSON.stringify(name) + '] is ' + value); 
     } 
     return value; 
    }); 
} 

它不是整体很不错的解决办法,但是,我认为,它比" + this.state.XXX + "更好。

+0

要知道,谷歌关闭可能重命名您的特性,这可能会导致一个讨厌的错误。 – ClojureMostly

0

如何:

format = function(format) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    return format.replace(/{(\d+)}/g, function(match, number) { 
     return typeof args[number] != 'undefined' 
     ? args[number] 
     : match 
     ; 
    }); 
}; 

然后

<div style={{transform: this.getTransform()}}></div> 
[...] 
getTransform: function() { 
    var s = this.state; 
    return format("translate({0}px, {1}px) scale({2}) rotate({3}deg)", 
      s.x, s.y, s.scale, s.angle); 
} 
+0

'“一个字符串”.format“你需要定义'String.prototype.format',而不是'String.format'。 扩展原型可能会影响我的应用程序的其他部分,我不认为这是个好主意。 – NVI

+0

更新了我的解决方案@NVI – ClojureMostly