问答

react native hooks 无限级分类菜单/折叠菜单/树形菜单

作者:admin 2021-04-18 我要评论

最近用react-native开发App的时候,用到一个侧边栏多级菜单,通过点击,实现无限分级菜单的核心功能(父子关系,展开与收起),在没有DOM的情况下,一时不知道怎...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

最近用react-native开发App的时候,用到一个侧边栏多级菜单,通过点击,实现无限分级菜单的核心功能(父子关系,展开与收起),在没有DOM的情况下,一时不知道怎么实现了。。。

View结构如下:

<view style="sidebar">
  <view>
    <view style="title">菜单1</view>
    <view>
      <view style="title">菜单1-1</view>
      <view></view>
    </view>
  </view>
  <view>
    <view style="title">菜单2</view>
    <view>
      <view style="title">菜单2-1</view>
      <view></view>
    </view>
  </view>
</view>

数据如下:

let data1 = [
  {
    id: 1,
    pid: 0,
    name: '员工管理',
  },
  {
    id: 3,
    pid: 1,
    name: '添加员工',
  },
  {
    id: 4,
    pid: 1,
    name: '删除员工',
  },
  {
    id: 5,
    pid: 4,
    name: '按姓名删除',
  },
  {
    id: 6,
    pid: 4,
    name: '按工号删除',
  },
  {
    id: 2,
    pid: 0,
    name: '菜单管理',
  },
  {
    id: 7,
    pid: 2,
    name: '修改菜单',
  }
];

let tree1 = [
  {
    id: 1,
    name: '员工管理',
    children: [
      {
        id: 3,
        name: '添加员工',
        children: []
      },
      {
        id: 4,
        name: '删除员工',
        children: [
          {
            id: 6,
            name: '按姓名删除',
            children: []
          },
          {
            id: 7,
            name: '按工号删除',
            children: []
          }
        ]
      }
    ],
  },
  {
    id: 2,
    name: '菜单管理',
    children: [
      {
        id: 5,
        name: '修改菜单',
        children: []
      }
    ],
  },
];

样式如下:

const styles = StyleSheet.create({
  sidebar: {
    width: 200,
    backgroundColor: 'rgba(0,0,0,.3)',
  },
  title: {
    padding: 5,
    textAlign: 'center',
    color: '#fff',
    fontSize: 18,
  },
  item: {
    backgroundColor: '#012658',
  }
});

辅助函数:

const arr2tree = (data, pid) => {
  let result = [], temp;
  for (let i = 0; i < data.length; i++) {
    if (data[i].pid == pid) {
      let obj = {"name": data[i].name, "id": data[i].id, "pid": data[i].pid};
      temp = arr2tree(data, data[i].id);
      if (temp.length > 0) {
        obj.children = temp;
      } else {
        obj.children = [];
      }
      result.push(obj);
    }
  }
  return result;
};

组件如下:

import React, {useState, useEffect} from 'react';
import {StyleSheet, View, Text, TouchableOpacity} from 'react-native';

function Menu() {
  const [tree, setTree] = useState([]);
  
  useEffect(() => {
    let tree = arr2tree(data1, 0);
    setTree(tree);
  }, []);
  
  const onPress = (menuObj) => {
    console.log(menuObj);
    // 在这里操作data1或者tree1
  };
  
  const createMenu = (menuObj) => {
    let vdom = [];
    if (menuObj instanceof Array) { // 子级菜单
    let list = [];
      for (let item of menuObj) {
        list.push(createMenu(item));
      }
      vdom.push(
        <View style={styles.item} key={Date.now()}>
          {list}
        </View>
      );
    } else { // 父级菜单
      vdom.push(
        <View key={menuObj.id}>
          <TouchableOpacity onPress={() => onPress(menuObj)}>
            <Text style={styles.title}>{menuObj.name}</Text>
          </TouchableOpacity>
          {createMenu(menuObj.children)}
        </View>
      )
    }
    return vdom;
  };
  
  return (
    <View style={styles.sidebar}>
      {createMenu(tree)}
    </View>
  )
}

目前进度:点击每一项,可以取到当前项数据,但是,怎么实现显示/隐藏,还在思考。
朋友们有没有什么好办法?

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器