Подтвердить что ты не робот

Можно ли определить метод ReactJS Mixin, который можно переопределить в компоненте React?

Библиотека Facebook ReactJS имеет строгие правила какие методы компонентов можно переопределить и как. Если это не разрешено , мы не можем переопределить метод.

Для моих собственных миксинов, как я могу обновить SpecPolicy, если у меня есть метод, который я хочу разрешить переопределить? Возможно ли это?

Этот пример немного изобретателен, но он должен получить точку. Скажем, у меня есть mixin ниже, который пытается предоставить метод renderItem по умолчанию, который должен быть переопределен, если необходимо. Когда я пытаюсь отобразить компонент <Hello ... />, я получаю ошибку Invariant Violation. Здесь вы можете найти jsfiddle.

var MyMixin = {
    render: function () {
        return this.renderItem();
    },
    renderItem: function () {
        return <div>Hello {this.props.name}</div>;
    }
};

var Hello = React.createClass({
    mixins: [MyMixin],
    renderItem: function() {
        return <div>Hey {this.props.name}</div>;
    }
});
4b9b3361

Ответ 2

Вы можете просто использовать что-то вроде jQuery expand, чтобы расширить объект, который был передан React.createClass, вместо использования mixin - это позволит вы по-прежнему будете использовать Mixins, когда захотите, и используйте этот метод, когда вам нужно (JS Fiddle):

/** @jsx React.DOM */

var MyMixin = {
    render: function () {
        return this.renderItem();
    },
    renderItem: function () {
        return <div>Hello {this.props.name}</div>;
    }
};

var Hello = React.createClass($.extend(MyMixin, {
    renderItem: function() {
        return <div>Hey {this.props.name}</div>;
    }
}));

React.renderComponent(<Hello name="World" />, document.body);

Ответ 3

Может быть, вы можете сделать что-то вроде этого, если вам по-прежнему нужна реализация rednerItem по умолчанию:

var MyMixin = {
  render: function () {
    return this.renderItem();
  },
  renderItem: function () {
    var customRender = this.customRenderItem;
    return customRender != undefined ? customRender() : <div>Hello {this.props.name}</div>;
  }
};

var Hello = React.createClass({
    mixins: [MyMixin],
    customRenderItem: function() {
      return <div>Hey {this.props.name}</div>;
    }
});

Ответ 4

Смесин имеет доступ к свойствам и состоянию компонента. Вы можете иметь несколько реализаций в mixin и использовать нужный вам инструмент на основе свойств/состояния.

Единственное, что вы хотите, чтобы убедиться, что компоненты, использующие mixin, имеют эти свойства/состояние или имеют реализацию по умолчанию.

Ответ 5

В ситуации, когда мне нужно предоставить некоторые свойства mixin, это зависит от моего класса реакции, я делаю mixin как функцию с необходимыми аргументами, которые возвращают объект mixin

//mixin.js
module.exports = function mixin(name){
  return {
    renderItem(){
      return <span>name</span>
    }
  };
}

//react-class.js
var myMixin = require('mixin');
module.exports = React.createClass({
    mixins:[myMixin('test')],
    render(){
        return this.renderItem();
    }
});
//result
<span>test</test>