2014-01-10 2 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

Имейте в виду, что Google закрытие может переименовать свойства, которые могли бы привести к неприятную ошибку. – 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

Смежные вопросы