Компоненты высшего порядка в Hyperstack

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
2
задан Mitch VanDuyn 5 April 2019 в 22:42
поделиться

1 ответ

Во-первых, похоже, есть проблема , которую вы должны исправить. Это будет исправлено в следующей версии: просто добавьте этот метод в базовый класс Hypercomponent (app/hyperstack/components/hypercomponent.rb)

def self.to_n
  Hyperstack::Internal::Component::ReactWrapper.create_native_react_class(self)
end

Теперь, если у вас есть следующие стили:

MY_STYLES = {root: {backgroundColor: 'red'}}
[ 1118] и компонент, который вы хотите стилизовать:

class StyleTest < HyperComponent
  param :some_param
  param :classes
  render do
    DIV(class: classes[:root]) { some_param }
  end
end

Вы можете сделать это так:

class StyledTest1 < HyperComponent
  imports `Mui.withStyles(#{MY_STYLES.to_n})(#{StyleTest.to_n})`
end

То, что происходит, - это то, что мы выпадаем в JS, используя обратные ссылки и вызывая Mui.with_styles напрямую и передавая его MY_STYLES (как в примере с MUI doc). to_n конвертирует из Ruby Hash в объект JS. (При передаче параметров компонентам это происходит автоматически, но не с простыми вызовами функций.)

Затем мы вызываем результирующий HOC с нашим классом StyleTest (также вызываем to_n для преобразования из класса Ruby в простой класс JS.)

Наконец, мы импортируем его обратно в класс компонентов Hyperstack.

Это немного больше работы, чем мне нравится, поэтому мы можем просто добавить удобный вспомогательный метод в наш класс HyperComponent:

class HyperComponent
  include Hyperstack::Component
  include Hyperstack::State::Observable
  param_accessor_style :accessors  # this is now the prefered param style

  # patch for issue: https://github.com/hyperstack-org/hyperstack/issues/153
  def self.to_n
    Hyperstack::Internal::Component::ReactWrapper.create_native_react_class(self)
  end

  # our helper macro:
  def self.add_styles(style, opts = {})
    imports `Mui.withStyles(#{style.to_n}, #{opts.to_n})(#{superclass.to_n})`
  end
end

Теперь мы можем добавить стили, как это:

[115 ]

и теперь у нас есть новый Класс Компонентов с нашим стилем в нем.

Например:

class App < HyperComponent

  render do
    DIV do
      StyledTest1(some_param: 'test 1')
      StyledTest2(some_param: 'test 2')
    end
  end
end
0
ответ дан Mitch VanDuyn 5 April 2019 в 22:42
поделиться
Другие вопросы по тегам:

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