Компоненты Accordion и Dialog для Material Design Lite

Существуют ли какие-либо компоненты аккордеона и модального диалога, которые действительно работают и совместимы с моей средой:

Google Material Design Lite версии 1.06
Facebook ReactJS 0.14.2
Microsoft TypeScript и Visual Studio 2015 (для связывания машинописного текста)

Я пытаюсь избежать раздувания библиотеки JavaScript, а в Material Design Lite отсутствуют эти важные виджеты. Я не использую Node.js, так как работаю на платформе Windows, поэтому Material-UI не вариант. MaterializeCSS раздувает мой проект Visual Studio и делает его очень медленным и непригодным для использования.


person Lambert    schedule 25.01.2016    source источник
comment
Поскольку вы хотите избежать раздувания, не думали ли вы написать свои собственные компоненты аккордеона и использовать состояние и стили для получения надлежащей функциональности? Вы, конечно, можете включить любые стили пользовательского интерфейса, которые вам нравятся. Я сделал это недавно. Я использовал состояние компонента для отслеживания открытых/закрытых аккордеонов. И имена классов css для отображения/скрытия (сворачивания/открытия) поведения.   -  person rambossa    schedule 25.01.2016
comment
Майкл - Можешь опубликовать код аккордеона? Я довольно зеленый в этом.   -  person Lambert    schedule 25.01.2016


Ответы (1)


Обновление от 28 сентября 2016 г.

Похоже, теперь для этого есть библиотека с открытым исходным кодом: https://github.com/fiffty/react-treeview-mui


Самостоятельная реализация

Этот ответ служит примером раскрывающегося списка Accordion, созданного с использованием React, но не оформленного в стиле Material Design. Вам нужно будет сделать это самостоятельно.

Для этой настройки требуется объект иерархии родительских > дочерних объектов/массивов. Этот базовый класс должен прекрасно справляться с очень большими глубинами. Он использует рекурсию для настройки своей структуры. Я также предпочитаю использовать синтаксис ES6, так как это упрощает настройку рекурсии.

Класс аккордеона:

// Accordian Class
// Dynamic/Recursive
// a parent>child>child... relationship is required
// the whole object can be named however you like,
// but each child object needs to be identified as "children"
class Accordian extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      openLevelRow: "", // this is the current open level row in an accordian (starts out with none being open)
      selfLevelObject: props.newLevel // the current level object containing all rows and their data/children
    };
  }

  // This is our toggle open/close method
  // if row is already open, close it
  // uniqueSelector is unique per row, and also a key
  // in the selfLevelObject (could be a name, id)
  toggleOpenClose(uniqueSelector) {
    // simple ternary assignment
    this.setState({
      openLevelRow: this.state.openLevelRow != uniqueSelector ? uniqueSelector : ""
    });
  }

  render () {  
    // deconstruct assignment from state
    const { selfLevelObject, openLevelRow } = this.state

    return (
      <div>
          {selfLevelObject.map((row, i) =>
              {/* Collectively where all children of the same hierchy level are listed*/}
              <div className="accordian-hold-self-level" key={i} >
                {/* This is an individual collapsable Row */}
                <div onClick={this.toggleOpenClose.bind(this, row.uniqueSelector)} className="accordian-title-row">
                  <p className='accordian-title'> {row.title}</p>
                </div>
                {/* 
                    When iterating the list, find out if a row has been opened
                */}
                {this.state.openLevelRow != row.uniqueSelector ? <span></span> : 
                    /* 
                      This code block is called if the current row is opened
                      now we to need to find out if there are children,
                      if not, then we are at the bottom, do what ever 
                      you'd like with the bottom row
                    */
                    selfLevelObject[uniqueSelector].children != undefined ? 
                      <Accordian newLevel={selfLevelObject[uniqueSelector].children} /> 
                      : // else
                    // TODO - whatever you want with bottom row
                }
              </div> 
          )}
        </div>
    );
  }
}

Accordian.propTypes = {
    newLevel: React.PropTypes.object
}
person rambossa    schedule 27.01.2016
comment
Майкл - Спасибо за пример кода. Мне придется сначала изучить ReactJS, прежде чем я попытаюсь преобразовать его в TypeScript и полностью протестировать. - person Lambert; 27.01.2016
comment
Для отсутствующего компонента Dialog я решил использовать компонент Cards в качестве основы для создания пользовательского диалога с ReactJS. Я также считаю, что могу использовать компонент «Меню» и/или стандартный тег выбора HTML для раскрывающихся меню. Я предполагаю, что версия 2.0 Material Design Lite будет включать эти компоненты. - person Lambert; 29.01.2016
comment
Эй, да, круто, и всегда помните, что вы можете найти компоненты / html, не относящиеся к React, и обернуть их в React самостоятельно. Я мог бы реализовать надежную версию аккордеона в эти выходные. Не уверена - person rambossa; 29.01.2016
comment
@Lambert, я знаю, что уже поздно, но похоже, что кто-то только что реализовал именно то, что вы хотели: github .com/fiffty/react-treeview-mui - person rambossa; 28.09.2016