Настройте направляющие для вывода вывода HTML вместо XHTML

Если вы прочитали Основные понятия из документов, это объясняется в Обработка событий .

You have to be careful about the meaning of this in JSX callbacks. In JavaScript, class methods are not bound by default. Узнайте больше об автобоксе на MDN

Также arrow functions не имеет собственного this. ( MDN ) Поэтому, когда вы делаете this.addtoFavorites.bind(this), нет this для привязки.

Итак, возможные способы обработки событий (в соответствии с документами):

Определите обработчики как обычные функции javascript и связывайте их в конструкторе , как в вашем случае

constructor(props) {
  // This binding is necessary to make `this` work in the callback
  this.addtoFavorites = this.addtoFavorites.bind(this);
}

function addtoFavorites (ev) {

[1121 ] используя экспериментальный синтаксис открытых полей классов , вы можете использовать поля классов для правильной привязки обратных вызовов (не уверен, если это все еще экспериментально):

// This syntax ensures `this` is bound within handleClick.
// Warning: this is *experimental* syntax.
addtoFavorites = (ev) => {
  ...

с использованием функции стрелки в callback

addtoFavorites = (ev) => {

onClick={(e) => this.addtoFavorites(e)}

Обратите внимание, однако, если вы используете это решение (из документов): Проблема с этим синтаксисом заключается в том, что каждый раз при рендеринге LoggingButton создается другой обратный вызов. В большинстве случаев это нормально. Однако, если этот обратный вызов передается в качестве поддержки более низким компонентам, эти компоненты могут выполнить дополнительный повторный рендеринг.

React рекомендует использовать решение binding.

Мы обычно рекомендуем связывание в конструкторе или использование синтаксиса полей классов, чтобы избежать такого рода проблем с производительностью.

8
задан deepwell 27 February 2009 в 17:58
поделиться

4 ответа

Этот ответ содержится в ссылке, предоставленной MarkusQ, но я полагал, что мог обстоятельно объяснить его точно.

Необходимо изменить код, чем рендеринг все теги, можно сделать это включением следующего кода во что-то как lib/dont_use_xhtml.rb

module ActionView::Helpers::TagHelper
  alias :tag_without_backslash :tag
     def tag(name, options = nil, open = true, escape = true)
        tag_without_backslash(name, options, open, escape)
     end 
  end 
5
ответ дан 5 December 2019 в 20:20
поделиться

Решение не работает с последней версией Rails. Некоторые хелперы переопределяют аргумент open метода от 'open' до 'false'.

В Rails 2.3.5 для меня работает следующее:

module ActionView::Helpers::TagHelper
  def tag_with_html_patch(name, options = nil, open = true, escape = true)
    tag_without_html_patch(name, options, true, escape)
  end
  alias_method_chain :tag, :html_patch
end

Положите это в инициализатор.

2
ответ дан 5 December 2019 в 20:20
поделиться
1
ответ дан 5 December 2019 в 20:20
поделиться

Для рельсов 2.3 :

Установите гем haml , затем добавьте следующий инициализатор config / initializers / force_html4.rb :

Haml::Template::options[:format] = :html4

module StandardistaHelper
  def tag(name, options = nil, open = false, escape = true)
    "<#{name}#{tag_options(options, escape) if options}>"
  end
end

ActionView::Base.send :include, StandardistaHelper

ActionView::Helpers::InstanceTag.class_eval do
  def tag_without_error_wrapping(name, options = nil, open = false, escape = true)
    "<#{name}#{tag_options(options, escape) if options}>"
  end
end
0
ответ дан 5 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: