gpt4 book ai didi

reactjs - 如何根据 Material UI 选定的表行设置组件状态

转载 作者:行者123 更新时间:2023-12-03 13:58:18 25 4
gpt4 key购买 nike

任何可以帮助学习者的指示表示赞赏。

我正在尝试构建什么

具有 2 个输入的表单:

  • 文本字段(患者电子邮件)
  • 数组(通过编译选定的表格行创建)

我正在尝试设置组件状态来存储文本字段的值和所选表行的数组,以便可以在提交时将状态传递到服务器。

代码(表行由占位符数据填充)

import React, { Component } from 'react';
import TextField from 'material-ui/TextField';
import RaisedButton from 'material-ui/RaisedButton';
import {Table, TableBody, TableFooter, TableHeader, TableHeaderColumn, TableRow, TableRowColumn} from 'material-ui/Table';

const tableData = [{
feedName: 'Flossing habit',
messageCount: '12 messages'
}, {
feedName: 'Post exo instructions',
messageCount: '5 messages'
}, {
feedName: 'Appointment feedback',
messageCount: '1 message'
}];

class NewPatient extends Component {
constructor (){
super();
this.state = ({
email: "",
feeds: []
});
this.setEmail = this.setEmail.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.onRowSelection = this.onRowSelection.bind(this);
}
setEmail(event) {
console.log(event.target.value);
this.setState({email: event.target.value})
}
handleSubmit(event){
event.preventDefault();
console.log(this.state);
//Meteor.call('console', this.state);
this.setState({email: ''});
}
onRowSelection(rows){
console.log(rows);
this.setState({feeds: rows})
}
render() {
let availableFeeds = tableData.map(feed=> {
return (
<TableRow key={feed.feedName}>
<TableRowColumn>{feed.feedName}</TableRowColumn>
<TableRowColumn>{feed.messageCount}</TableRowColumn>
</TableRow>
)});
return (
<form onSubmit={this.handleSubmit}>
<TextField
name='email'
value={this.state.email}
onChange={this.setEmail}
hintText='Patient email address'
/>
<Table multiSelectable={true} onRowSelection={this.onRowSelection}>
<TableHeader displaySelectAll={false}>
<TableRow>
<TableHeaderColumn>Feed Name</TableHeaderColumn>
<TableHeaderColumn>Number of messages</TableHeaderColumn>
</TableRow>
</TableHeader>
<TableBody>
{availableFeeds}
</TableBody>
</Table>
<RaisedButton type="Submit" label="Send" primary={true} />
</form>
)
}
}
;

export default NewPatient;

我面临的问题

设置所选行数组的组件状态。当我使用时:

onRowSelection(rows){
console.log(rows);
this.setState({feeds: rows})
}
  • 选定的行不会保持“选定”状态,状态也不会反射(reflect)选定的行。
  • 如果我从这里删除 setState 函数,那么突然可以选择行 - 只要选择更改,console.log(rows) 就会显示所选行的更新数组,但是,如果您将焦点从它移开,则表会重置(例如,如果您选择一行然后移至文本字段)。
<小时/>

我怀疑,但不确定(如果这是问题,不知道如何使用它,在 http://www.material-ui.com/#/components/table 的文档中找不到任何内容),我需要在“onRowSelection”中添加一个函数操作每行中的“选定” bool 值..?

有人有这方面的经验或看到我遗漏的明显东西吗?

预先感谢所有读到这里的人!非常感谢任何相关链接/文档的建议/指针。

最佳答案

在 themeteorchef.com 的 Ryan 帮助下找到解决方案后回答:

主要注意事项:

<强>1。 Material-UI 表具有 deselectOnClickaway 属性 - 确保将其设置为 false!

<强>2。我们需要找到一种方法,在每次选择/取消选择任何其他行或表单的其他部分时设置每行的“选定”状态(类似于 Shouvik Roy 的答案)

import React, { Component } from 'react';
import TextField from 'material-ui/TextField';
import RaisedButton from 'material-ui/RaisedButton';
// import { _ } from 'meteor/underscore';
import {Table, TableBody, TableFooter, TableHeader, TableHeaderColumn, TableRow, TableRowColumn} from 'material-ui/Table';

const tableData = [{
feedName: 'Flossing habit',
messageCount: '12 messages',
selected: false,
}, {
feedName: 'Post exo instructions',
messageCount: '5 messages',
selected: false,
}, {
feedName: 'Appointment feedback',
messageCount: '1 message',
selected: false,
}];

class NewPatient extends Component {
constructor (){
super();
this.state = ({
email: "",
feeds: tableData
});
this.setEmail = this.setEmail.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.onRowSelection = this.onRowSelection.bind(this);
}
setEmail(event) {
console.log(event.target.value);
this.setState({email: event.target.value})
}
handleSubmit(event){
event.preventDefault();
console.log(this.state);
Meteor.call('console', this.state.email);
this.setState({email: ''});
}
onRowSelection(rows){
const selectedFeeds = [];
this.state.feeds.forEach((feed, i) => {
feed.selected = rows.indexOf(i) > -1;
selectedFeeds.push(feed);
});
// console.log(selectedFeeds);
this.setState({feeds: selectedFeeds}, () => {
console.log(this.state.feeds);
});
}
render() {
let availableFeeds = this.state.feeds.map((feed, i) => {
return (
<TableRow key={feed.feedName} selected={feed.selected}>
<TableRowColumn>{feed.feedName}</TableRowColumn>
<TableRowColumn>{feed.messageCount}</TableRowColumn>
</TableRow>
)});
return (
<form onSubmit={this.handleSubmit}>
<TextField
name='email'
value={this.state.email}
onChange={this.setEmail}
hintText='Patient email address'
/>
<Table multiSelectable={true} onRowSelection={this.onRowSelection}>
<TableHeader displaySelectAll={false}>
<TableRow>
<TableHeaderColumn>Feed Name</TableHeaderColumn>
<TableHeaderColumn>Number of messages</TableHeaderColumn>
</TableRow>
</TableHeader>
<TableBody deselectOnClickaway={false}>
{availableFeeds}
</TableBody>
</Table>
<RaisedButton type="Submit" label="Send" primary={true} />
</form>
)
}
}
;

export default NewPatient;

关于reactjs - 如何根据 Material UI 选定的表行设置组件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39995836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com