【问题标题】:Controlled disabled button Material UI - React JS受控禁用按钮 Material UI - React JS
【发布时间】:2020-07-17 18:34:54
【问题描述】:

我有一个简短的问题。我正在尝试有条件地禁用按钮。基本上,如果从我的表中选择了某些东西,那么我允许该按钮可用,否则它被禁用。我知道 MUI 需要一个布尔值才能禁用或启用按钮,因此我正在从我的数组中执行 forEach 循环并获取 selected 的值。但是,即使我有 selected 的值,似乎也没有任何反应。任何想法我做错了什么? 我的数组:

data: [{
 ....
 selected : true / false
 ....
}]

我的按钮:

 <Tooltip title='Download'>
        <Button
            className={classes.root}
            key='DownloadAll'
            disabled={data.forEach(element => element.selected)}
            color='primary'
            onClick={(event) => buttonOnClick()}
        >
            <SvgIcon
                component={faDownload}
            />
        </Button>
    </Tooltip>

【问题讨论】:

标签: javascript reactjs material-ui


【解决方案1】:

如果您需要返回布尔值,只需使用Array.prototype.some()

下面是一个快速的现场演示,可以看到这种方法的实际效果:

const { useState } = React,
      { render } = ReactDOM,
      rootNode = document.getElementById('root')
      
const App = () => {
  const [tableData, setTableData] = useState([
          {id:0, content: 'row1', selected: false},
          {id:1, content: 'row2', selected: false},
          {id:2, content: 'row3', selected: false}
        ]),
        onSelect = _id => {
          const tableDataShallowCopy = [...tableData],
                targetRowIdx = tableDataShallowCopy.findIndex(({id}) => id == _id)
          if(targetRowIdx>-1){
            tableDataShallowCopy.splice(targetRowIdx,1, {
              ...tableData[targetRowIdx],
              selected: !tableData[targetRowIdx].selected
            })
            setTableData(tableDataShallowCopy)
          }
        }
  return (
    <div>
      <table>
        <thead>
          <tr><th>Header</th></tr>
        </thead>
        <tbody>
          {
            tableData.map(({id,content,selected}) => (
              <tr 
                onClick={() => onSelect(id)}
                className={selected ? 'selected' : ''}
                key={id}
              >
                <td>
                  {content}
                  <input 
                    type="checkbox"
                    value={id}
                    checked={selected}
                  />
                </td>
              </tr>
            ))
          }
        </tbody>
      </table>
      <button disabled={!tableData.some(({selected}) => selected)}>Button</button>
    </div>
  )        
}  

render(
  <App />,
  rootNode
)
.selected {
  background-color: orange;
  color: #fff;
}

tr {
  cursor: pointer;
}
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"&gt;&lt;/script&gt;&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js"&gt;&lt;/script&gt;&lt;div id="root"&gt;&lt;/div&gt;

【讨论】:

  • 无论是 {data.some(element =&gt; element.selected)} 或 {data.forEach(element => element.selected)} 我得到了布尔值 truefalse ,但我想知道为什么按钮没有被禁用
  • data.forEach(element =&gt; console.log(element.selected)); 我在控制台中看到它返回了selected 的状态,所以truefalse
  • @PandaMastr :查看我的答案的最新编辑,我对数据结构做了一些假设,如果不合适,请告诉我
  • 感谢您的推动。我的方式完全不同,但由于您的示例,我成功地做到了。谢谢队友的欢呼
【解决方案2】:

您可能希望创建一个由“如果从您的表中选择某些内容”操作设置的本地状态,然后使用状态值来切换您的按钮禁用状态。

【讨论】:

  • 我不想将我的组件与本地状态绑定。我想保持动态,只在需要时插入数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多