Реагировать.js:Передача значений внутри атрибутов

StackOverflow https://stackoverflow.com//questions/21038584

  •  21-12-2019
  •  | 
  •  

Вопрос

Я портирую следующий код из AngularJS в React:

<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 + " и это очень тяжело читать.

Есть ли лучший способ сделать это?

Это было полезно?

Решение

Я придумал функцию микрошаблонов в стиле 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 + ".

Другие советы

Как насчет:

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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top