Treeview React Component
Treeview React component represents Framework7's Treeview component.
Treeview Components
There are following components included:
Treeview- main treeview containerTreeviewItem- treeview item
Treeview Properties
| Prop | Type | Default | Description | 
|---|---|---|---|
| <TreeviewItem> properties | |||
| toggle | boolean | Enables treeview item toggle button. By default enabled if there are children item | |
| itemToggle | boolean | false | Enables whole treeview item as toggle | 
| selectable | boolean | false | Makes item selectable | 
| selected | boolean | Makes item selected | |
| opened | boolean | false | Defines whether the item opened by default or not | 
| label | string | Item label text | |
| loadChildren | boolean | false | Enable when you need to load children items on open. | 
| link | string boolean  | Enables link and link URL if specified as string. Same as href attribute | |
| <TreeviewItem> icon related properties | |||
| iconSize | string number  | Icon size in px | |
| iconColor | string | Icon color. One of the default colors | |
| icon | string | Custom icon class | |
| iconF7 | string | Name of F7 Icons font icon | |
| iconMaterial | string | Name of Material Icons font icon | |
| iconIos | string | Icon to be used in case of iOS theme is used. Consists of icon family and icon name divided by colon, e.g. f7:house | |
| iconMd | string | Icon to be used in case of MD theme is used. Consists of icon family and icon name divided by colon, e.g. material:home | |
| iconAurora | string | Icon to be used in case of Aurora theme is used. Consists of icon family and icon name divided by colon, e.g. material:home | |
| <TreeviewItem> navigation/router related properties | |||
| href | string boolean  | # | URL of the page to load. In case of boolean href="false" it won't add href tag | 
| target | string | Value of link target attribute, e.g. _blank, _self, etc. | |
| view | string | CSS selector of the View to load the page. Or current to load in current view. | |
| external | boolean | Enable to bypass Framework7's link click handler | |
| back | boolean | Enables back navigation link | |
| openIn | string | Allows open page route as modal or panel. Can be popup, loginScreen, sheet, popover or panel | |
| force | boolean | Force page to load and ignore previous page in history (use together with back prop) | |
| reloadCurrent | boolean | Reloads new page instead of the currently active one | |
| reloadPrevious | boolean | Replace the previous page in history with the new one from route | |
| reloadAll | boolean | Load new page and remove all previous pages from history and DOM | |
| reloadDetail | boolean | Reload Detail page in Master Detail view | |
| animate | boolean | Disables pages animation | |
| transition | string | Name of the custom page transition | |
| ignoreCache | boolean | Ignores caching | |
| routeTabId | string | Routable Tab id | |
| routeProps | object | Object with additional props that will be passed to target route component | |
| preventRouter | boolean | false | If set, then it won't be processed by Framework7 router | 
| <TreeviewItem> action related properties | |||
| panelOpen | string boolean  | CSS selector of panel to open on click. Or can be left or right if there is only left or right panel in DOM. | |
| panelClose | string boolean  | Closes panel on click | |
| panelToggle | string boolean  | CSS selector of panel to toggle on click. Or can be left or right if there is only left or right panel in DOM. | |
| actionsOpen | string boolean  | CSS selector of the action sheet to open on click | |
| actionsClose | string boolean  | CSS selector of the action sheet to close on click. Or boolean property to close currently opened action sheet | |
| popupOpen | string boolean  | CSS selector of the popup to open on click | |
| popupClose | string boolean  | CSS selector of the popup to close on click. Or boolean property to close currently opened popup | |
| popoverOpen | string boolean  | CSS selector of the popover to open on click | |
| popoverClose | string boolean  | CSS selector of the popover to close on click. Or boolean property to close currently opened popover | |
| sheetOpen | string boolean  | CSS selector of the sheet modal to open on click | |
| sheetClose | string boolean  | CSS selector of the sheet modal to close on click. Or boolean property to close currently opened sheet modal | |
| loginScreenOpen | string boolean  | CSS selector of the login screen to open on click | |
| loginScreenClose | string boolean  | CSS selector of the login screen to close on click. Or boolean property to close currently opened login screen | |
| sortableEnable | string boolean  | CSS selector of the Sortable list to be enabled on click | |
| sortableDisable | string boolean  | CSS selector of the Sortable list to be disabled on click. Or boolean property to close currently opened Sortable list | |
| sortableToggle | string boolean  | CSS selector of the Sortable list to toggle on click. Or boolean property to toggle currently opened/closed Sortable list | |
| searchbarEnable | string boolean  | CSS selector of the Expandable Searchbar to be enabled on click. Or boolean property to enable the first found Searchbar | |
| searchbarDisable | string boolean  | CSS selector of the Expandable Searchbar to be disabled on click. Or boolean property to disable the first found Searchbar | |
| searchbarToggle | string boolean  | CSS selector of the Expandable Searchbar to toggle on click. Or boolean property to toggle the first found Searchbar | |
| searchbarClear | string boolean  | CSS selector of the Expandable Searchbar to clear on click. Or boolean property to clear the first found Searchbar | |
| cardOpen | string boolean  | CSS selector of the expandable card to open on click. Or boolean to open first found expandable card | |
| cardClose | string boolean  | CSS selector of the expandable card to close on click. Or boolean property to close currently opened expandable card | |
| cardPreventOpen | boolean | Click on element with this prop won't open its parent expandable card | |
| menuClose | boolean | Closes Menu dropdown on click | |
Treeview Events
| Event | Description | 
|---|---|
| <TreeviewItem> events | |
| click | Event will be triggeres when user clicks on treeview item | 
| treeviewOpen | Event will be triggered on item open | 
| treeviewClose | Event will be triggered on item close | 
| treeviewLoadChildren | Event will be triggered on first open of Treeview item with loadChildren prop. In event.detail it contains function to hide loading preloader. | 
Treeview Item Slots
Treeview React component (<TreeviewItem>) has additional slots for custom elements:
root-start- element will be inserted in the beginning of treeview item elementroot/root-end- element will be inserted in the end of treeview item elementcontent-start- element will be inserted in the beginning of<div class="treeview-item-content">elementcontent/content-end- element will be inserted in the end of<div class="treeview-item-content">elementchildren-start- element will be inserted in the beginning of the<div class="treeview-item-children">elementdefault- element will be inserted in the end of the<div class="treeview-item-children">elementmedia- element will be inserted before<div class="treeview-item-label">elementlabel-start- element will be inserted in the beginning<div class="treeview-item-label">elementlabel- element will be inserted in the end of<div class="treeview-item-label">element
<TreeviewItem label="Item 1">
  <img src="path-to-my-image.jpg" slot="media">
  <div slot="root-start">Root Start</div>
  <div slot="root">Root End</div>
  <div slot="content-start">Content Start</div>
  <div slot="content">Content End</div>
  <span slot="label-start">Before Label</span>
  <TreeviewItem label="Sub Item 1" />
  ...
</TreeviewItem>
<!-- Renders to: -->
<div class="treeview-item">
  <div class="treeview-item-root">
    <div>Root Start</div>
    <div class="treeview-toggle"></div>
    <div class="treeview-item-content">
      <div>Content Start</div>
      <img src="path-to-my-image.jpg">
      <div class="treeview-item-label">
        <span>Before Label</span>
        Item 1
      </div>
      <div>Content End</div>
    </div>
  </div>
  <div class="treeview-item-children">
    <div class="treeview-item">
      <div class="treeview-item-root">
        <div class="treeview-item-content">
          <div class="treeview-item-label">Sub Item 1</div>
        </div>
      </div>
    </div>
    ...
  </div>
  <div>Root End</div>
</div>
Examples
import React, { useState } from 'react';
import {
  Page,
  Navbar,
  BlockTitle,
  Block,
  Treeview,
  TreeviewItem,
  Checkbox,
  f7,
} from 'framework7-react';
export default () => {
  const [state, setState] = useState({
    checkboxes: {
      images: {
        'avatar.png': false,
        'background.jpg': false,
      },
      documents: {
        'cv.docx': false,
        'info.docx': false,
      },
      '.gitignore': false,
      'index.html': false,
    },
    selectedItem: null,
    loadedChildren: [],
  });
  const toggleSelectable = (e, item) => {
    if (f7.$(e.target).is('.treeview-toggle')) return;
    state.selectedItem = item;
    setState({ ...state });
  };
  const loadChildren = (done) => {
    setTimeout(() => {
      // call done() to hide preloader
      done();
      state.loadedChildren = [
        {
          name: 'John Doe',
        },
        {
          name: 'Jane Doe',
        },
        {
          name: 'Calvin Johnson',
        },
      ];
      setState({ ...state });
    }, 2000);
  };
  return (
    
      
    <Page>
      <Navbar title="Treeview" />
      <BlockTitle>Basic tree view</BlockTitle>
      <Block strong className="no-padding-horizontal">
        <Treeview>
          <TreeviewItem label="Item 1">
            <TreeviewItem label="Sub Item 1">
              <TreeviewItem label="Sub Sub Item 1" />
              <TreeviewItem label="Sub Sub Item 2" />
            </TreeviewItem>
            <TreeviewItem label="Sub Item 2">
              <TreeviewItem label="Sub Sub Item 1" />
              <TreeviewItem label="Sub Sub Item 2" />
            </TreeviewItem>
          </TreeviewItem>
          <TreeviewItem label="Item 2">
            <TreeviewItem label="Sub Item 1">
              <TreeviewItem label="Sub Sub Item 1" />
              <TreeviewItem label="Sub Sub Item 2" />
            </TreeviewItem>
            <TreeviewItem label="Sub Item 2">
              <TreeviewItem label="Sub Sub Item 1" />
              <TreeviewItem label="Sub Sub Item 2" />
            </TreeviewItem>
          </TreeviewItem>
          <TreeviewItem label="Item 3" />
        </Treeview>
      </Block>
      <BlockTitle>With icons</BlockTitle>
      <Block strong className="no-padding-horizontal">
        <Treeview>
          <TreeviewItem label="images" iconF7="folder_fill">
            <TreeviewItem label="avatar.png" iconF7="photo_fill" />
            <TreeviewItem label="background.jpg" iconF7="photo_fill" />
          </TreeviewItem>
          <TreeviewItem label="documents" iconF7="folder_fill">
            <TreeviewItem label="cv.docx" iconF7="doc_text_fill" />
            <TreeviewItem label="info.docx" iconF7="doc_text_fill" />
          </TreeviewItem>
          <TreeviewItem label=".gitignore" iconF7="logo_github" />
          <TreeviewItem label="index.html" iconF7="doc_text_fill" />
        </Treeview>
      </Block>
      <BlockTitle>With checkboxes</BlockTitle>
      <Block strong className="no-padding-horizontal">
        <Treeview>
          <TreeviewItem label="images" iconF7="folder_fill">
            <Checkbox
              slot="content-start"
              checked={Object.values(state.checkboxes.images).indexOf(false) < 0}
              indeterminate={
                Object.values(state.checkboxes.images).indexOf(false) >= 0 &&
                Object.values(state.checkboxes.images).indexOf(true) >= 0
              }
              onChange={(e) => {
                Object.keys(state.checkboxes.images).forEach((k) => {
                  state.checkboxes.images[k] = e.target.checked;
                });
                setState({ ...state });
              }}
            />
            <TreeviewItem label="avatar.png" iconF7="photo_fill">
              <Checkbox
                slot="content-start"
                checked={state.checkboxes.images['avatar.png']}
                onChange={(e) => {
                  state.checkboxes.images['avatar.png'] = e.target.checked;
                  setState({ ...state });
                }}
              />
            </TreeviewItem>
            <TreeviewItem label="background.jpg" iconF7="photo_fill">
              <Checkbox
                slot="content-start"
                checked={state.checkboxes.images['background.jpg']}
                onChange={(e) => {
                  state.checkboxes.images['background.jpg'] = e.target.checked;
                  setState({ ...state });
                }}
              />
            </TreeviewItem>
          </TreeviewItem>
          <TreeviewItem label="documents" iconF7="folder_fill">
            <Checkbox
              slot="content-start"
              checked={Object.values(state.checkboxes.documents).indexOf(false) < 0}
              indeterminate={
                Object.values(state.checkboxes.documents).indexOf(false) >= 0 &&
                Object.values(state.checkboxes.documents).indexOf(true) >= 0
              }
              onChange={(e) => {
                Object.keys(state.checkboxes.documents).forEach((k) => {
                  state.checkboxes.documents[k] = e.target.checked;
                });
                setState({ ...state });
              }}
            />
            <TreeviewItem label="cv.docx" iconF7="doc_text_fill">
              <Checkbox
                slot="content-start"
                checked={state.checkboxes.documents['cv.docx']}
                onChange={(e) => {
                  state.checkboxes.documents['cv.docx'] = e.target.checked;
                  setState({ ...state });
                }}
              />
            </TreeviewItem>
            <TreeviewItem label="info.docx" iconF7="doc_text_fill">
              <Checkbox
                slot="content-start"
                checked={state.checkboxes.documents['info.docx']}
                onChange={(e) => {
                  state.checkboxes.documents['info.docx'] = e.target.checked;
                  setState({ ...state });
                }}
              />
            </TreeviewItem>
          </TreeviewItem>
          <TreeviewItem label=".gitignore" iconF7="logo_github">
            <Checkbox
              slot="content-start"
              checked={state.checkboxes['.gitignore']}
              onChange={(e) => {
                state.checkboxes['.gitignore'] = e.target.checked;
                setState({ ...state });
              }}
            />
          </TreeviewItem>
          <TreeviewItem label="index.html" iconF7="doc_text_fill">
            <Checkbox
              slot="content-start"
              checked={state.checkboxes['index.html']}
              onChange={(e) => {
                state.checkboxes['index.html'] = e.target.checked;
                setState({ ...state });
              }}
            />
          </TreeviewItem>
        </Treeview>
      </Block>
      <BlockTitle>Whole item as toggle</BlockTitle>
      <Block strong className="no-padding-horizontal">
        <Treeview>
          <TreeviewItem itemToggle label="images" iconF7="folder_fill">
            <TreeviewItem label="avatar.png" iconF7="photo_fill" />
            <TreeviewItem label="background.jpg" iconF7="photo_fill" />
          </TreeviewItem>
          <TreeviewItem itemToggle label="documents" iconF7="folder_fill">
            <TreeviewItem label="cv.docx" iconF7="doc_text_fill" />
            <TreeviewItem label="info.docx" iconF7="doc_text_fill" />
          </TreeviewItem>
          <TreeviewItem label=".gitignore" iconF7="logo_github" />
          <TreeviewItem label="index.html" iconF7="doc_text_fill" />
        </Treeview>
      </Block>
      <BlockTitle>Selectable</BlockTitle>
      <Block strong className="no-padding-horizontal">
        <Treeview>
          <TreeviewItem
            selectable
            selected={state.selectedItem === 'images'}
            label="images"
            iconF7="folder_fill"
            onClick={(e) => toggleSelectable(e, 'images')}
          >
            <TreeviewItem
              selectable
              selected={state.selectedItem === 'avatar.png'}
              label="avatar.png"
              iconF7="photo_fill"
              onClick={(e) => toggleSelectable(e, 'avatar.png')}
            />
            <TreeviewItem
              selectable
              selected={state.selectedItem === 'background.jpg'}
              label="background.jpg"
              iconF7="photo_fill"
              onClick={(e) => toggleSelectable(e, 'background.jpg')}
            />
          </TreeviewItem>
          <TreeviewItem
            selectable
            selected={state.selectedItem === 'documents'}
            label="documents"
            iconF7="folder_fill"
            onClick={(e) => toggleSelectable(e, 'documents')}
          >
            <TreeviewItem
              selectable
              selected={state.selectedItem === 'cv.docx'}
              label="cv.docx"
              iconF7="doc_text_fill"
              onClick={(e) => toggleSelectable(e, 'cv.docx')}
            />
            <TreeviewItem
              selectable
              selected={state.selectedItem === 'info.docx'}
              label="info.docx"
              iconF7="doc_text_fill"
              onClick={(e) => toggleSelectable(e, 'info.docx')}
            />
          </TreeviewItem>
          <TreeviewItem
            selectable
            selected={state.selectedItem === '.gitignore'}
            label=".gitignore"
            iconF7="logo_github"
            onClick={(e) => toggleSelectable(e, '.gitignore')}
          />
          <TreeviewItem
            selectable
            selected={state.selectedItem === 'index.html'}
            label="index.html"
            iconF7="doc_text_fill"
            onClick={(e) => toggleSelectable(e, 'index.html')}
          />
        </Treeview>
      </Block>
      <BlockTitle>Preload children</BlockTitle>
      <Block strong className="no-padding-horizontal">
        <Treeview>
          <TreeviewItem
            toggle
            loadChildren
            iconF7="person_2_fill"
            label="Users"
            onTreeviewLoadChildren={(e, done) => loadChildren(done)}
          >
            {state.loadedChildren.map((item, index) => (
              <TreeviewItem key={index} iconF7="person_fill" label={item.name} />
            ))}
          </TreeviewItem>
        </Treeview>
      </Block>
      <BlockTitle>With links</BlockTitle>
      <Block strong className="no-padding-horizontal">
        <Treeview>
          <TreeviewItem iconF7="square_grid_2x2_fill" itemToggle label="Modals">
            <TreeviewItem link="/popup/" iconF7="link" label="Popup" />
            <TreeviewItem link="/dialog/" iconF7="link" label="Dialog" />
            <TreeviewItem link="/action-sheet/" iconF7="link" label="Action Sheet" />
          </TreeviewItem>
          <TreeviewItem iconF7="square_grid_2x2_fill" itemToggle label="Navigation Bars">
            <TreeviewItem link="/navbar/" iconF7="link" label="Navbar" />
            <TreeviewItem link="/toolbar-tabbar/" iconF7="link" label="Toolbar & Tabbar" />
          </TreeviewItem>
        </Treeview>
      </Block>
    </Page>
      
    
  );
};



