【问题标题】:Add Dynamic TextFields Through Dropdown Component Selection?通过下拉组件选择添加动态文本字段?
【发布时间】:2020-03-29 00:28:31
【问题描述】:

在下面的项目中,我正在使用 TypeScript 和 Microsoft Excel 中的 React 创建一个任务窗格。当任务窗格加载时,它只会有一个带有几个选项的基本下拉菜单。

import * as React from "react";
import Progress from "./Progress";
import { Dropdown, DropdownMenuItemType, IDropdownStyles, IDropdownOption } from 'office-ui-fabric-react/lib/Dropdown';
//import TopLevel from "./Operations/TopLevel";
//import MakeItem from "./Operations/MakeItem";
//import RawMaterial from "./Operations/RawMaterial";
//import BuyItem from "./Operations/BuyItem";
export interface AppProps {
  title: string;
  isOfficeInitialized: boolean;
}

export interface AppState {

}

export default class App extends React.Component<AppProps, AppState> {
  constructor(props, context) {
    super(props, context);
    this.state = {
    };
  }

  componentDidMount() {
    this.setState({

    });
  }

  render() {
    const { title, isOfficeInitialized } = this.props;
    const dropdownStyles: Partial<IDropdownStyles> = {
      dropdown: { width: 300 }
    };
    const options: IDropdownOption[] = [
      { key: 'blank', text: '' },
      { key: 'topLevelMake', text: 'Parents', itemType: DropdownMenuItemType.Header },
      { key: 'topLevel', text: 'TOP LEVEL' },
      { key: 'make', text: 'MAKE ITEM' },
      { key: 'divider_1', text: '-', itemType: DropdownMenuItemType.Divider },
      { key: 'Purchased', text: 'Purchases', itemType: DropdownMenuItemType.Header },
      { key: 'rawMaterial', text: 'RAW MATERIAL' },
      { key: 'buyItem', text: 'BUY ITEM' },
    ];
    ;
    if (!isOfficeInitialized) {
      return (
        <Progress title={title} logo="assets/logo-filled.png" message="Please sideload your addin to see app body." />
      );
    }

    return (
      <div className="ms-welcome">
            <Dropdown
              label="Operation"
              key="dropDownKey"
              options={options}
              styles={dropdownStyles}
            />
      </div>
    );
  }
}

在收到 Klas 的回复后,我稍微更改了代码,但遇到了麻烦,因为没有抛出任何错误。我有我的 App.tsx、我的 TopLevel.tsx 和我因为 Klas 而创建的名为 Dropdown.tsx 的新文件。现在我会忘记“Make”,我只是想理解逻辑。我在这里做错了什么?

App.tsx

import * as React from "react";
import Dropdown from "./Operations/Dropdown";
export interface AppProps {
  title: string;
  isOfficeInitialized: boolean;
}
export interface AppState {

}

function App() {
  return <Dropdown />;
}

export default App;

Dropdown.tsx

import * as React from "react";
import TopLevel from './TopLevel';
import { useState } from 'react';
const Dropdown = (): React.ReactElement => {
    const [value, setValue] = useState("none");
    let Form: any;
    switch (value) {
      case "TopLevel":
        Form = <TopLevel title="title" logo="logo" message="message" />;
        break;

      case "Make":
        Form = <div />;
        break;

      default:
        Form = <div />;
        break;
    }
    return (
      <div>
        <select
          id="lang"
          onChange={event => event?.target?.value && setValue(event.target.value)}
          value={value}
        >
          <option value="select">Select</option>
          <option value="TopLevel">TopLevel</option>
          <option value="Make">Make</option>
        </select>
        {Form}
      </div>
    );
  };
  export default Dropdown;

TopLevel.tsx

import * as React from "react";

export interface TopLevelProps {
  title: string;
  logo: string;
  message: string;
}
export default class TopLevel extends React.Component<TopLevelProps> {
  render() {
    return (
      <div>
        <div>TopLevel</div>
        <input placeholder="Part Number" />
      </div>
    );
  }
}

这是我得到的错误。

【问题讨论】:

标签: reactjs typescript office-js office-ui-fabric office-js-helpers


【解决方案1】:

这是一个基本程序,它有一个下拉菜单,会根据下拉菜单的值显示不同的表单。

const Dropdown = (): React.ReactElement => {
  const [value, setValue] = useState("none");

  let Form: any;
  switch (value) {
    case "TopLevel":
      Form = <TopLevel title="title" logo="logo" message="message" />;
      break;

    case "Make":
      Form = <Make />;
      break;

    default:
      Form = <div />;
      break;
  }

  return (
    <div>
      <select
        id="lang"
        onChange={event => event?.target?.value && setValue(event.target.value)}
        value={value}
      >
        <option value="select">Select</option>
        <option value="TopLevel">TopLevel</option>
        <option value="Make">Make</option>
      </select>
      {Form}
    </div>
  );
};

export interface TopLevelProps {
  title: string;
  logo: string;
  message: string;
}

class TopLevel extends React.Component<TopLevelProps> {
  render() {
    return (
      <div>
        <div>TopLevel</div>
        <input placeholder="Part Number" />
      </div>
    );
  }
}

class Make extends React.Component<{}> {
  render() {
    return <div>Make</div>;
  }
}

function App() {
  return <Dropdown />;
}

注意switch 如何让您对不同的值有不同的形式。

您正在使用的DropDown 组件也有一个onChange 属性,因此应该可以以类似的方式进行连接,为不同的值提供不同的表单渲染。

【讨论】:

  • 非常感谢@Klas Mellbourn!我将对此进行深入研究,并尝试在我的代码中进行调整并回复您!
  • 嗨 Klas Melbourn,我在上面的更新代码中缺少什么?我把东西放错地方了吗?谢谢
  • 请明确说明什么不起作用?下拉菜单在吗?你可以从中选择值吗?执行时没有显示任何内容吗?
  • 我添加了我的 npm 错误的屏幕截图。很抱歉造成混乱
猜你喜欢
  • 2013-12-14
  • 1970-01-01
  • 2014-10-29
  • 2021-07-13
  • 2011-11-12
  • 2016-10-19
  • 2022-01-05
  • 2020-01-08
  • 2016-07-08
相关资源
最近更新 更多