Контроль способа, которым выбранное значение внутри поля выбора выглядит: есть ли способ визуализировать выбранный элемент отдельно? - PullRequest
2 голосов
/ 09 июля 2019

Я работаю с полем выбора antd '. Я попытался настроить контент внутри Option, который содержит обычный text с некоторым JSX. Это выглядит следующим образом:

enter image description here

Вот также небольшая демонстрация, которую я подготовил в песочнице:

Edit epic-hofstadter-tswpz

Поскольку я настроил контент внутри Option, в тот момент, когда я делаю выбор с помощью поля выбора, он отображается как:

enter image description here

Как вы могли видеть, окно выбора пытается показать все. Есть ли способ контролировать внешний вид окна выбора сразу после того, как выбор сделан с помощью окна выбора? Я просто хочу, чтобы имя отображалось после выбора. Например, product-1 должно отображаться при выборе первой опции.

Для удобства пользования я также размещаю код здесь:

    import React from "react";
import ReactDOM from "react-dom";
import "antd/dist/antd.css";
import "./index.css";
import { Select } from "antd";

const { Option } = Select;

const data = [
  {
    productName: "product-1",
    productExternalId: "DT01A",
    productionExternalId: "PL-DT01A",
    quantity: "700 kg"
  },
  {
    productName: "product-2",
    productExternalId: "DT01A",
    productionExternalId: "PL-DT01A",
    quantity: "700 kg"
  },
  {
    productName: "product-3",
    productExternalId: "DT01A",
    productionExternalId: "PL-DT01A",
    quantity: "700 kg"
  }
];

const ProductSelectBox = React.memo(props => {
  const { details } = props;

  function onSelect(value, option) {
    console.log(value, "..", option);
  }

  function customizedOption({
    productName,
    productExternalId,
    productionExternalId,
    quantity
  }) {
    return (
      <Option
        className="product-select-box-item"
        key={productName}
        value={productName}
      >
        <div className="d-flex flex-column">
          <div className="d-flex" style={{ marginBottom: "0.2rem" }}>
            <div className="mr-auto-1 font-weight-bold">{productName}</div>

            <div className="uppercase">{productionExternalId}</div>
          </div>

          <div className="d-flex" style={{ marginBottom: "0.01rem" }}>
            <div className="mr-auto-1 uppercase">{productExternalId}</div>
            <div>{quantity}</div>
          </div>
        </div>
      </Option>
    );
  }

  return (
    <Select
      // labelInValue
      // defaultValue={{ key: "product-3", label: "product-3" }}
      className="product-select-box"
      size="large"
      onSelect={onSelect}
    >
      {details.map(product => customizedOption(product))}
    </Select>
  );
});

ReactDOM.render(
  <div>
    <ProductSelectBox details={data} />
  </div>,
  document.getElementById("container")
);

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Ссылаясь на ваш комментарий :

Чтобы исправить ваши предупреждения, на customizedDisplayOnSelection и getSelectedMeta вы должны вернуть ReactNode, а не string, например, выможет просто вернуть null, который является действительным ReactNode или не вернуть ничего.

function customizedDisplayOnSelection(productName) {
  if (productMap[productName]) {
  ...
  }
  // or
  else {
    return null;
  }
}

Кроме того, вы можете воспользоваться && коротким замыканием.

const customizedDisplayOnSelection = productName =>
  productMap[productName] && (
    <span className="font-weight-medium">
      {productMap[productName].productExternalId} -{productName}
    </span>
  );

Проверьте фиксированный пример:

Edit Q-56954681-FixWarning

0 голосов
/ 09 июля 2019

Мне удалось достичь этого с помощью свойства value в поле Select.Вот демо, которое я обновил в песочнице:

Edit epic-hofstadter-tswpz

Для удобства пользования я также публикую код здесь:

import React, { useState } from "react";
import ReactDOM from "react-dom";
import "antd/dist/antd.css";
import "./index.css";
import { Select } from "antd";

const { Option } = Select;

const data = [
  {
    productName: "product-1",
    productExternalId: "DT01A",
    productionExternalId: "PL-DT01A",
    quantity: "700 kg"
  },
  {
    productName: "product-2",
    productExternalId: "DT02A",
    productionExternalId: "PL-DT02A",
    quantity: "702 kg"
  },
  {
    productName: "product-3",
    productExternalId: "DT03A",
    productionExternalId: "PL-DT03A",
    quantity: "703 kg"
  }
];

const ProductSelectBox = React.memo(props => {
  const { details } = props;
  let { defaultSelected } = props;

  const productMap = {};
  details.forEach(product => {
    productMap[product.productName] = product;
  });

  const [selectedProduct, selectProduct] = useState(defaultSelected);

  function onSelect(value) {
    selectProduct(value);
  }

  function customizedDisplayOnSelection(productName) {
    if (productMap[productName]) {
      const productExternalId = productMap[productName]["productExternalId"];
      return (
        <span className="font-weight-medium">
          {productExternalId} - {productName}
        </span>
      );
    } else {
      return "";
    }
  }

  function getSelectedMeta() {
    if (productMap[selectedProduct]) {
      return (
        <span className="font-weight-medium">
          (
          <span className="uppercase">
            production id: {productMap[selectedProduct]["productionExternalId"]}
          </span>
          <span style={{ marginLeft: "0.75rem" }}>
            Batch Size: {productMap[selectedProduct]["quantity"]}
          </span>
          )
        </span>
      );
    } else {
      return "";
    }
  }

  function customizedOption({
    productName,
    productExternalId,
    productionExternalId,
    quantity
  }) {
    return (
      <Option
        className="product-select-box-item"
        key={productName}
        value={productName}
      >
        <div className="d-flex flex-column">
          <div className="d-flex" style={{ marginBottom: "0.2rem" }}>
            <div className="mr-auto-1 font-weight-bold">{productName}</div>

            <div className="uppercase">{productionExternalId}</div>
          </div>

          <div className="d-flex" style={{ marginBottom: "0.01rem" }}>
            <div className="mr-auto-1 uppercase">{productExternalId}</div>
            <div>{quantity}</div>
          </div>
        </div>
      </Option>
    );
  }

  return (
    <div className="d-flex flex-row">
      <Select
        className="product-select-box auto-flex"
        size="large"
        value={customizedDisplayOnSelection(selectedProduct)}
        onSelect={onSelect}
      >
        {details.map(product => customizedOption(product))}
      </Select>
      <div className="d-flex align-items-center auto-flex">
        {getSelectedMeta()}
      </div>
    </div>
  );
});

ReactDOM.render(
  <div>
    <ProductSelectBox details={data} defaultSelected="" />
  </div>,
  document.getElementById("container")
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...