【问题标题】:How to create a table with user input?如何使用用户输入创建表?
【发布时间】:2020-10-03 12:09:44
【问题描述】:

我是开发新手,欢迎任何帮助:)

这是我的问题:

我正在使用 next.js - 这可能很重要,因为 f.ex。 document.createElement 似乎只适用于 useEffect。

我创建了一个文本区域,用户可以在其中添加用逗号分隔的单词(例如“Nike、Adidas、New Balance”)。我想重写下面的现有代码,以便:

  • 表格仅在用户在输入框中添加内容时可见/出现
  • 输入框中的每个单词(例如 Nike、Adidas)都会在表中创建一个新行(在表头“品牌”中)。

到现在为止,我正在尝试使用 .split 和 .forEach 方法来创建一个新的元素(表)。但我就是无法让它发挥作用——也许这不是正确的解决方案。欢迎任何帮助!

function Analyzer() {
  
  const [brand, setBrand] = React.useState('');
  const handleChange = (event) => {
    setBrand(event.target.value.split(','))};
  
  return(            
    <div>
      <textarea type="text" 
              placeholder="Example:
              Nike, Adidas, New Balance ..." 
              onChange={handleChange}></textarea>

      <table className={styles.table}>
         <thead>
             <tr>
                <th>No.</th>
                <th>Brand</th>
                <th>Also known as</th>
                <th>Avg. price</th>
             </tr>
          </thead>
          <tbody>
              <tr>
                 <td>1</td>
                 <td>{brand}</td>
                 <td></td>
                 <td><input type= "number"></input>%</td>
              </tr>
          </tbody>
      </table>

     </div>);
}

【问题讨论】:

    标签: javascript reactjs next.js user-input


    【解决方案1】:

    尝试以下方法。我所做的是将Table 组件提取出来,并在其中放置任何渲染条件。你甚至可以为这个组件创建一个单独的文件并将任何相关的 props 传递给它。

    其次,我在handleChange 函数中将品牌列表设置为brands。然后使用.map 迭代此状态变量以呈现表中的每一行。

    function Analyzer() {
      const [brands, setBrands] = React.useState([]);
    
      const handleChange = ({ target }) => {
        const { value } = target;
        setBrands(value.split(','));
      };
    
      const Table = () => {
        if (!brands || brands.length === 0) return null;
    
        return (
          <table className={styles.table}>
            <thead>
              <tr>
                <th>No.</th>
                <th>Brand</th>
                <th>Also known as</th>
                <th>Avg. price</th>
              </tr>
            </thead>
            <tbody>
              {brands.map((brand) => (
                 <tr>
                   <td>1</td>
                   <td>{brand}</td>
                   <td></td>
                   <td><input type= "number"></input>%</td>
                 </tr>
               )}
            </tbody>
          </table>
        );
      };
    
      return(            
        <div>
          <input 
            onChange={handleChange}
            placeholder="Example: Nike, Adidas, New Balance ..."
            type="text"
            value={brands}
          />
          <Table />
       </div>
      );
    };
    

    【讨论】:

    • 感谢您的帮助和解释!我想我理解你的想法。如果一切顺利,我会检查并提供更新!
    • 我修改了一点代码,验证!brands || brands === '' 将永远无法工作,因为您的brands 默认值是一个数组。无论如何,如果数组为空,您的 map 函数将不返回任何内容,因此无需在那里进行验证(表格将使用 0 数据行呈现)。如果您需要验证,最好检查它是否为空数组。
    • 我检查了代码并且表格运行良好(仅在 .map 中添加了可选的索引参数)。感谢你们!只有一个小问题:即使没有输入,我也能看到表头。有没有可能一开始就让它不可见?试图将brands.map移到顶部,但头部多次显示。
    • 是的,这就是为什么我在表格组件的开头有条件。我已经对其进行了编辑(尽管有所不同)以检查数组中是否有项目。我这样做是因为如果没有输入,我们根本不想渲染表格。
    • 太棒了。现在一切正常。我将它作为一个组件保存在一个单独的文件中 - 感谢您的提示!
    猜你喜欢
    • 2023-03-28
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多