前端项目实战叁佰肆拾壹react-admin和material ui-rc-tree demo使用



import React, { useState } from "react"
import { List as ListM, fetchUtils } from "react-admin";
import postgrestRestProvider, { IDataProviderConfig, defaultPrimaryKeys, defaultSchema } from '@raphiniert/ra-data-postgrest';
import { Collapse, Grid, ListItem, ListItemText, Paper, List } from "@material-ui/core";
import { ExpandLess, ExpandMore } from "@material-ui/icons";
import { useNavigate } from "react-router-dom";
import { ITreeDataList, IChildren } from "./common";

import Tree from 'rc-tree';
import "rc-tree/assets/index.css"
export interface ICategoryList {
    id: number,
    category_name: string
    t_prod_style: IProdList[]
}
export interface IProdList {
    id: number,
    style_name: string
}
export interface ICategory {
    categoryId: number,
}
interface ITreeList {
    TreeDataList?: any,
    handleNavigate: (data: any) => void
}
const STYLE = `
.rc-tree-child-tree {
  display: block;
}

.node-motion {
  transition: all .3s;
  overflow-y: hidden;
}
`;
function getTreeData() {
    // big-data: generateData(1000, 3, 2)
    return [
      {
        key: '0',
        title: 'node 0',
        children: [
          { key: '0-0', title: 'node 0-0' },
          { key: '0-1', title: 'node 0-1' },
          {
            key: '0-2',
            title: 'node 0-2',
            children: [
              { key: '0-2-0', title: 'node 0-2-0' },
              { key: '0-2-1', title: 'node 0-2-1' },
              { key: '0-2-2', title: 'node 0-2-2' },
            ],
          },
          { key: '0-3', title: 'node 0-3' },
          { key: '0-4', title: 'node 0-4' },
          { key: '0-5', title: 'node 0-5' },
          { key: '0-6', title: 'node 0-6' },
          { key: '0-7', title: 'node 0-7' },
          { key: '0-8', title: 'node 0-8' },
          {
            key: '0-9',
            title: 'node 0-9',
            children: [
              { key: '0-9-0', title: 'node 0-9-0' },
              {
                key: '0-9-1',
                title: 'node 0-9-1',
                children: [
                  { key: '0-9-1-0', title: 'node 0-9-1-0' },
                  { key: '0-9-1-1', title: 'node 0-9-1-1' },
                  { key: '0-9-1-2', title: 'node 0-9-1-2' },
                  { key: '0-9-1-3', title: 'node 0-9-1-3' },
                  { key: '0-9-1-4', title: 'node 0-9-1-4' },
                ],
              },
              {
                key: '0-9-2',
                title: 'node 0-9-2',
                children: [
                  { key: '0-9-2-0', title: 'node 0-9-2-0' },
                  { key: '0-9-2-1', title: 'node 0-9-2-1' },
                ],
              },
            ],
          },
        ],
      },
      {
        key: '1',
        title: 'node 1',
        // children: new Array(1000)
        //   .fill(null)
        //   .map((_, index) => ({ title: `auto ${index}`, key: `auto-${index}` })),
        children: [
          {
            key: '1-0',
            title: 'node 1-0',
            children: [
              { key: '1-0-0', title: 'node 1-0-0' },
              {
                key: '1-0-1',
                title: 'node 1-0-1',
                children: [
                  { key: '1-0-1-0', title: 'node 1-0-1-0' },
                  { key: '1-0-1-1', title: 'node 1-0-1-1' },
                ],
              },
              { key: '1-0-2', title: 'node 1-0-2' },
            ],
          },
        ],
      },
    ];
  }
const defaultExpandedKeys = ['0', '0-2', '0-9-2'];
const motion = {
    motionName: 'node-motion',
    motionAppear: false,
    onAppearStart: () => ({ height: 0 }),
    onLeaveActive: () => ({ height: 0 }),
    onAppearActive: (node:any) => ({ height: node.scrollHeight }),
    onLeaveStart: (node:any) => ({ height: node.offsetHeight }),
  };
const TreeList = (props: ITreeList) => {
    const { TreeDataList } = props
    const navigate = useNavigate()
    const [openStyle, setOpenStyle] = useState(true);
    const [StyleSelect, setStyleSelect] = useState<String>("");
    const [CategorySelect, setCategorySelect] = useState<String>("");
    const [styleId, setStyleId] = useState<String>("");
    const [selectTitle, setSelectTitle] = useState(false);
    const handleCatagory = (dataId: String) => {
        setStyleId(dataId);
        setOpenStyle(!openStyle)
    };
    const handleSelectCatagory = (categoryId: String) => {
        setCategorySelect(categoryId)
        setStyleSelect("")
        setSelectTitle(false)
        const url = `CategoryLists/${categoryId}`
        navigate(url)
        props.handleNavigate && props.handleNavigate({ categoryId: categoryId })
    };
    const handleSelectTitle = () => {
        setSelectTitle(true)
        setStyleSelect("")
        setCategorySelect("")
        const url = `CatagoryTitle`
        navigate(url)
    };
    const handleStyleSelect = (categoryId: any) => {
        setStyleSelect(categoryId)
        setCategorySelect("")
        setSelectTitle(false)
        const url = `StyleListView/${categoryId}`
        navigate(url)
        props.handleNavigate && props.handleNavigate({})
    };

    return (
        <Grid style={{ width: "200px", margin: "24px 0 0 24px" }} >
            <Paper>
                <ListItem button style={selectTitle ? { background: '#ccc' } : {}} onClick={() => handleSelectTitle()}>
                    <ListItemText primary={TreeDataList?.name} />
                </ListItem>
                {TreeDataList.children && TreeDataList?.children.map((item: any, i: number) => (
                    <Collapse in={true} timeout="auto" unmountOnExit>
                        <List component="div" >
                            <ListItem style={CategorySelect == item.id ? { background: '#ccc' } : {}} button onClick={() => handleSelectCatagory(item.id)}>
                                <ListItemText primary={item.category_name} />
                                {openStyle && styleId == item.id ? <ExpandLess onClick={() => handleCatagory(item.id)} /> : <ExpandMore onClick={() => handleCatagory(item.id)} />}
                            </ListItem>
                            {item.t_prod_style.map((detailItem: any, j: number) => (
                                <Collapse in={openStyle && styleId == item.id} timeout="auto" unmountOnExit>
                                    <List style={{ margin: "0px 0px 0 24px" }} component="div">
                                        <ListItem style={StyleSelect == detailItem.id ? { background: '#ccc' } : {}} button onClick={() => handleStyleSelect(detailItem.id)}>
                                            <ListItemText primary={detailItem.style_name} />
                                        </ListItem>
                                    </List>
                                </Collapse>
                            ))}
                        </List>
                    </Collapse>
                ))}
            </Paper>
            <div>
            <style dangerouslySetInnerHTML={{ __html: STYLE }} />
                <Tree
                    defaultExpandAll={true}
                    defaultExpandedKeys={defaultExpandedKeys}
                    motion={motion}
                    treeData={getTreeData()}
                />
            </div>
        </Grid>
    )
}
export default TreeList;

运行结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 `react-native-svg` 和 `react-native-svg-transformer` 加载本地 SVG 图像,你可以按照以下步骤进行操作: 1. 首先,确保你已经在项目中安装了 `react-native-svg` 和 `react-native-svg-transformer` 依赖。你可以通过运行以下命令来安装它们: ``` npm install react-native-svg react-native-svg-transformer ``` 2. 在项目的根目录下创建一个名为 `metro.config.js` 的文件(如果已存在,请跳过此步骤)。 3. 在 `metro.config.js` 文件中添加以下内容: ```javascript module.exports = { transformer: { assetPlugins: ['react-native-svg-transformer'], }, }; ``` 4. 接下来,在你的组件中,使用 `react-native-svg` 中的 `<SvgUri>` 组件来加载本地 SVG 图像。首先,确保你的 SVG 图像位于项目的 `assets` 文件夹中。 ```javascript import React from 'react'; import { View } from 'react-native'; import SvgUri from 'react-native-svg-uri'; const MyComponent = () => { return ( <View> <SvgUri width={200} height={200} source={require('./assets/myImage.svg')} /> </View> ); }; export default MyComponent; ``` 在上面的示例中,我们使用 `require` 方法加载位于 `assets` 文件夹中的 `myImage.svg` 图像,并将其作为 `source` 属性传递给 `<SvgUri>` 组件。你可以根据自己的需要调整宽度和高度。 5. 确保你在重新启动 Metro Bundler 之前完成了以上步骤。你可以通过运行以下命令重新启动 Metro Bundler: ``` npx react-native start --reset-cache ``` 这样,你就可以使用 `react-native-svg` 和 `react-native-svg-transformer` 成功加载和显示本地 SVG 图像了。 希望对你有所帮助!如有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值