Синтаксический анализ реквизитов react для компонента react из представления HTML

#javascript #reactjs #react-props

#javascript #reactjs #react-props

Вопрос:

Я работаю над проектом, который в основном создан с использованием PHP и HTML, и я хочу создать виджет с React.js .

Для достижения этой цели я создал компонент React и использовал его тег react в представлении HTML следующим образом, все работает нормально, кроме синтаксического анализа реквизита.

Мой вид HTML:

 <div class="col-md-12 col-xs-12 prod-schedule" id="ProgressBarWidget">
    <ProgressBars date='foo'></ProgressBars>
</div>
 

Соответствующий компонент react JS:

 const Element = document.getElementById("ProgressBarWidget");

class ProgressBars extends React.Component{

    render(props){
        return (
            <div>
                <label>Cakes</label>
                <div className="progress">
                    <div className="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40"
                    aria-valuemin="0" aria-valuemax="100" style={{width:60 '%'}}>
                        40% Complete {this.props.date}
                    </div>
                </div>

            </div>
        )
    }
}
ReactDOM.render(<ProgressBars />, Element);
 

Моя проблема заключается в анализе этого свойства ‘date’ для компонента react. Это работает, когда я добавляю этот реквизит для рендеринга функции следующим образом:

 ReactDOM.render(<ProgressBars date='sample'/>, Element);
 

Но я хочу проанализировать его из представления HTML.

  • Я использую react CDN.
  • Дата — это просто фиктивные данные, которые я позже интегрирую с реальными значениями.

Комментарии:

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

2. Я попытался получить его из конструктора, но он не определен. @Wale

3. тогда позвольте мне запустить образец, одну минуту

4. Итак, позвольте мне прояснить, чего вы пытаетесь достичь, это визуализировать компонент react без использования ReactDOM.render ?

5. Нет, я просто хочу проанализировать реквизит для компонента, из которого он вызывается. @AlanOmar

Ответ №1:

React превращает компонент react в некоторый допустимый элемент DOM. То, что вы сделали с вашим PHP ( <ProgressBars date='foo'></ProgressBars> ), не является допустимым элементом DOM.

Вам нужно отобразить с помощью вашего PHP-кода заполнитель для виджета, обычно используемого с id (как вы это делали). Затем отобразите React в нем элемент.

Если вы хотите передать данные из PHP в компонент react, у вас есть несколько вариантов:

  1. Если у вас мало значений для передачи, вы можете передать их с помощью data атрибута
 // some-file.php
<div
  class="col-md-12 col-xs-12 prod-schedule"
  id="ProgressBarWidget"
  data-prop1="value1"
  data-prop2="value2"></div>
 
 const Element = document.getElementById("ProgressBarWidget");
const data = {
  prop1: Element.dataset.props1,
  prop2: Element.dataset.props2,
};

class ProgressBars extends React.Component {
  render(props) {
    return (
      <div>
        <label>Cakes</label>
        <div className="progress">
          <div
            className="progress-bar progress-bar-success"
            role="progressbar"
            aria-valuenow="40"
            aria-valuemin="0"
            aria-valuemax="100"
            style={{ width: 60   '%' }}>
            40% Complete {this.props.date}
          </div>
        </div>
      </div>
    );
  }
}

ReactDOM.render(<ProgressBars data={data} />, Element);
 
  1. Если у вас большой json, создайте встроенный тег скрипта с идентификатором и проанализируйте его содержимое
 // some-file.php
<div class="col-md-12 col-xs-12 prod-schedule" id="ProgressBarWidget"></div>
<script type="application/json" id="ProgressBarWidgetData">
{
  "foo": "bar",
  "foo1": "bar2",
  ... // your large data object
}
</script>
 
 const Element = document.getElementById("ProgressBarWidget");
const data = JSON.parse(document.getElementById("ProgressBarWidgetData").contentText);

class ProgressBars extends React.Component {
  render(props) {
    return (
      <div>
        <label>Cakes</label>
        <div className="progress">
          <div
            className="progress-bar progress-bar-success"
            role="progressbar"
            aria-valuenow="40"
            aria-valuemin="0"
            aria-valuemax="100"
            style={{ width: 60   '%' }}>
            40% Complete {this.props.date}
          </div>
        </div>
      </div>
    );
  }
}

ReactDOM.render(<ProgressBars data={data} />, Element);
 

Комментарии:

1. Да, это сработало бы. Значит, в этом вопросе нет способа получить данные в качестве реквизита?

2. React компонент не получает свои реквизиты из DOM, поэтому нет :]

3. Ага! Затем мне нужно использовать глобальную переменную и получить к ней доступ внутри компонента React. Спасибо.