Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将react-table行数据传递给react-modal

将react-table行数据传递给react-modal
EN

Stack Overflow用户
提问于 2020-01-19 01:10:35
回答 2查看 4.3K关注 0票数 3

作为React的新手,我很难将数据从react-table传递到"edit“模式,似乎找不到类似问题的解决方案。数据通过Axios API调用从数据库中获取,并呈现在反应表中。我需要将呈现的行的数据传递给一个模态,以便随后发出put请求并将数据更新到服务器。编辑按钮位于模式类中,然后呈现在表格上。

下面您可以看到modal&form类,然后在表类中调用它。

代码语言:javascript
运行
AI代码解释
复制
import React, { Component, Fragment } from 'react';
import { Button, Modal, ModalHeader, ModalBody, Form, FormGroup, Input, Label } from 'reactstrap';
import Axios from 'axios';


class CompanyModal extends Component {
    constructor(props) {
        super(props);
    this.state = {
        modal: props.initialModalState,
        id: '',
        title: '',
        address: '',
        phoneNumber : '',
        email: ''
    };
    this.toggle = this.toggle.bind(this);
}

componentDidMount() {
    if (this.props.company) {
        const { id, title, address, phoneNumber, email } = this.props.company
        this.setState({ id,title, address, phoneNumber, email});
    }
}
onChange = e => {
    this.setState({ [e.target.name]: e.target.value })
}


submitNew = e => {
    e.preventDefault()
    Axios.post('localhost:44394/api/companies/Create', this.state)
    .then(res => {
    console.log(res)})
    .catch(error => {
        console.log(error)
    })
}

submitEdit = e =>{
    e.preventDefault()
    Axios.put(`localhost:44394/api/companies/update/${this.state.id}`, this.state)
    .then(res => {
        console.log(res)
    })
    .catch(error => {
        console.log(error)
    })
}
    toggle () {
        this.setState({
            modal: !this.state.modal
        });
    }

    render() {
        const isNew = this.props.isNew;

        let title = 'Edit Company';
        let button = '';
        if (isNew) {
            title = 'Add Company';

            button = <Button
                color="success"
                onClick={this.toggle}
                style={{ minWidth: "200px" }}>Add Company</Button>;
        } else {
            button = <Button
                className="btn-icon btn-round"
                size="sm"
                color="warning"
                onClick={this.toggle}><i className="fa fa-edit" />
                </Button>;
        }

        return <Fragment>
            {button}
            <Modal isOpen={this.state.modal} toggle={this.toggle} className={this.props.className}>
                <ModalHeader toggle={this.toggle}>{title}</ModalHeader>
                <ModalBody>
                    <Form onSubmit={this.props.company ? this.submitEdit : this.submitNew}>
                        <FormGroup>
                            <Label for="name">Name:</Label>
                            <Input type="text" name="title" onChange={this.onChange} value= 
                                 {this.state.Title === '' ? '' : this.state.Title} />
                        </FormGroup>
                        <FormGroup>
                            <Label for="address">Address:</Label>
                            <Input type="text" name="address" onChange={this.onChange} value= 
                                 {this.state.address === null ? '' : this.state.company} />
                        </FormGroup>
                        <FormGroup>
                            <Label for="phoneNumber">Phone Number:</Label>
                            <Input type="number" name="phoneNumber" onChange={this.onChange} value= 
                                 {this.state.phoneNumber === null ? '' : this.state.phoneNumber} />
                        </FormGroup>
                        <FormGroup>
                            <Label for="email">Email:</Label>
                            <Input type="email" name="email" onChange={this.onChange} value= 
                                 {this.state.email === null ? '' : this.state.email} />
                        </FormGroup>
                        <Button type="submit">Submit</Button>
                    </Form>
                </ModalBody>
            </Modal>
        </Fragment>;
    }
    }
export default CompanyModal;

表代码

代码语言:javascript
运行
AI代码解释
复制
import React, { Component } from "react";
import ReactTable from "react-table";
import CompanyModal from "../Forms/CompanyModal";
import axios from "axios";
import {
  Card,
  CardBody,
  CardHeader,
  CardTitle,
  Row,
  Col,
  Button,
  ButtonToolBar
} from "reactstrap";

 var data

class CompanyTable extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      posts:[]
    };
  }


componentDidMount(){
  axios.get(`https://localhost:44394/api/companies`)
  .then(res => {
    const posts = res.data;
    this.setState({posts});
  })
}

  render() {
    const posts = this.props.posts;
    const columns =[
      {
        Header: "Id",
        accessor: "id",
        show: false
      },
      {
        Header: "Name",
        accessor: "title"
      },
      {
        Header: "Address",
        accessor: "adress"
      },
      {
        Header: "Phone Number",
        accessor: "phoneNumber"
      },
      {
        Header: "Actions",
        Cell: props =>{
          return ( 
            <div className="actions-right">




            <CompanyModal/>





            <div/>
          )
        },
        sortable: false,
        filterable: false
       }
    ]
    return (
      <>      
          <Row>
            <Col xs={12} md={12}>
              <Card>
                <CardHeader>
                  <CardTitle tag="h4">Companies</CardTitle>
                  <CompanyModal isNew/>
                </CardHeader>
                <CardBody>
                  <ReactTable
                    data={this.state.posts}
                    filterable
                    columns = {columns}
                    defaultPageSize={10}
                    showPaginationTop
                    showPaginationBottom={false}
                    className="-striped -highlight"
                    />                 
                </CardBody>
              </Card>
            </Col>
          </Row>          
      </>
    );
  }
}

export default CompanyTable;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-19 07:17:18

您可以对模态组件使用componentDidUpdate来观察道具的变化并设置状态。

(componentWillReceiveProps现在已弃用)

假设您想要将属性exampleProp从表视图传递到模式视图:

代码语言:javascript
运行
AI代码解释
复制
class CompanyModal extends Component {
    constructor(props) {
        super(props);
    this.state = {
        exampleState: 'something'
        // ... other states
    };
}

... other code

componentDidUpdate(nextProps) {

 if (nextProps.exampleProp !== this.props.exampleProp) {// New prop value
this.setState({exampleState: nextProps.exampleProp})
}
}

... other code

在您的表视图中:

代码语言:javascript
运行
AI代码解释
复制
        Header: "Actions",
        Cell: props =>{
          return ( 
            <div className="actions-right">
            <CompanyModal exampleProp={this.state.yourTableViewState} />
            <div/>
          )
        },
        sortable: false,
        filterable: false
       }
票数 0
EN

Stack Overflow用户

发布于 2020-08-23 20:01:39

我使用钩子解决了这个问题,方法如下:

代码语言:javascript
运行
AI代码解释
复制
const [show, setShow] = useState(false);
const [selectedRow, setSelectedRow] = useState({});

const handleClose = () => setShow(false);
const handleShow = (selected) => {
  setSelectedRow(selected);
  setShow(true);
  };

我创建了一个setter变量来包含被单击的行;然后使用useState来更新状态变量。

唯一棘手的事情是从react-table获取原始的行数据,但它最终变得非常简单。

在组件中(或您想要触发模式显示的任何位置),添加一个onClick属性并将您的handleShow传递给row.original以获取所有数据。

代码语言:javascript
运行
AI代码解释
复制
<tbody className='body' {...getTableBodyProps()}>
              {page.map((row, i) => {
                prepareRow(row);
                return (
                  <Fragment key={row.getRowProps().key}>
                    <tr className='tr' onClick={() =>   handleShow(row.original)}>
                      {row.cells.map((cell) => {
                        return (
                          <td className='td' {...cell.getCellProps()}>
                            {cell.render("Cell")}
                          </td>
                        );
                      })}
                    </tr>
                  </Fragment>
                );
              })}
            </tbody>

我们可以从创建表行的.map函数访问行。在我的例子中,我使用了分页,所以你所映射的可能是不同的。在任何情况下,行都应该对您可用。

该行上可用的其他属性包括:

代码语言:javascript
运行
AI代码解释
复制
allCells: (12) [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]
cells: (12) [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]
depth: 0
getRowProps: ƒ (userProps)
id: "1"
index: 1
original: {processing_agent: "Smitty", log_id: "ASDJFEIF87ASDF", date_created: "2020-08-12 02:39:13+00:00", log_amount: "0.06", company_name: "Kinkos",}
originalSubRows: []
subRows: []
values: {processing_agent: "Smitty", log_id: "ASDJFEIF87ASDF", company_name: "Kinkos", invoice_count: "1", merchant_log_status: "UNKNOWN",}
__proto__: Object
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59806312

复制
相关文章
勿套“公式”!谈谈UI设计中的字号,间距,大小等规律
静电说:新手在学习UI设计过程中,通常会陷入到一个误区中,就是把UI设计当算术题来做。比如经常会有同学问:UI界面中的字号最小是多少?UI界面模块中的间距有没有什么规则可以遵循?是不是一定要4的倍数?UI界面左右留白多少才合适,有规范吗?按钮的圆角多少才合适?
用户5009027
2020/09/01
4.6K0
编写 vuetify 全局 snackbar
components/snackbar.vue <template> <v-snackbar v-model="open" :bottom="bottom" :color="color" :timeout="2000">{{ msg }}</v-snackbar> </template> <script lang='ts'> import { Component, Vue } from "vue-property-decorator"; @Component export default cla
4O4
2022/04/25
1K0
VUE-Vuetify框架
Vue虽然会帮我们进行视图的渲染,但样式还是由我们自己来完成。这显然不是我们的强项,因此后端开发人员一般都喜欢使用一些现成的UI组件,拿来即用,常见的例如:
cwl_java
2020/02/11
4.3K0
vue vuetify 实现智能联想
使用 Vuetify 中的 v-menu 组件实现,控制光标焦点,在输入框获取的焦点时弹出联想词汇菜单,支持上下按键选中内容,菜单位置,样式按需调整即可
kirin
2020/11/03
8840
修改xshell的默认字间距和行间距
可能是不小心修改了xshell的某个配置,导致打开的会话中显示字间距和行间距都非常大,严重影响工作。 参照官方手册也不能修改正常,详见:http://www.xshellcn.com/wenti/xiugai-ziti.html。
编程随笔
2019/09/11
2.3K0
修改xshell的默认字间距和行间距
神经网络(TensorFlow)游乐场
TensorFlow游乐场是一个通过网页浏览器就可以训练的简单神经网络并实现了可视化训练过程的工具。可以去简单地模拟深度学习的过程。连线越粗表明权重越大。
里克贝斯
2021/05/21
1.5K0
神经网络(TensorFlow)游乐场
vuetify-使用详细入门教程
写在前面的话,公司工作很久了,一直都没有改过自己的技术栈,才觉得慢慢的落后于潮流,也知道自己的技术栈很老旧,想过要重构项目,但是项目周期时间一直不许,学习vue只能在下班的时间里面,这两年也断断续续的用过一些框架,但最后还是选中了vuetify。
王小婷
2020/05/26
7K0
vuetify-使用详细入门教程
Vue引入vuetify框架你需要知道的几点
2、在src目录中创建一个名为的文件夹plugins在里面,添加一个vuetify.js文件。代码如下
马克社区
2022/06/03
6480
[Office] 段落间距调整
选中需要设置的段落
轻舞飞扬SR
2021/02/24
2.4K0
[Office] 段落间距调整
Figma中的自动布局要怎么用?一篇文学会官方说明文件
静电说:Figma在最近的几次更新中,发表了全新的Auto Layout(自动布局)功能,要知道,在之前的自动布局功能中,我们只能使用很简单的布局效果(类似于Sketch中的自动布局),而本次Figma在更新后,自动布局更加的完善好用,可以做出非常多的响应式效果。
用户5009027
2020/12/02
9.3K0
Figma中的自动布局要怎么用?一篇文学会官方说明文件
PCB的安全间距如何设计?
PCB设计中有诸多需要考虑到安全间距的地方。在此,暂且归为两类:一类为电气相关安全间距,一类为非电气相关安全间距。
MCU起航
2020/06/29
1.3K0
设置UITextView的行间距
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53261917
用户1451823
2018/09/13
2K0
解决 vuetify 中 icon 显示错乱问题
Vuetify 使用 Google's Roboto fon 和 Material Design Icons。安装这些软件的最简单方式是将他们的 CDN 包含在你的主 index.html 中。
4O4
2022/04/25
1.4K0
设置UILabel的行间距
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53262085
用户1451823
2018/09/13
1.3K0
html导航栏自动调间距,HTML CSS导航栏间距[通俗易懂]
我做了一个CSS导航栏,但是在每个“navbar-item”之间,都有一点空间。我不希望那里有任何变化!有没有办法做到这一点,而不改变每个navbar-item的余裕?HTML CSS导航栏间距
全栈程序员站长
2022/09/01
5.6K0
inline-block空格间距问题的解决
真正意义上的inline-block水平呈现的元素间,换行显示或空格分隔的情况下会有间距,很简单的个例子:
javascript.shop
2019/09/04
8810
inline-block空格间距问题的解决
(转)iOS学习——UIlabel设置行间距和字间距
  在iOS开发中经常会用到UIlabel来展示一些文字性的内容,但是默认的文字排版会觉得有些挤,为了更美观也更易于阅读我们可以通过某些方法将UIlabel的行间距和字间距按照需要调节。
mukekeheart
2019/01/07
4K0
译|CSS中的间距,前端开发中各种设置间距的优点缺点及实例
如果两个或多个元素很接近,那么用户就会认为它们以某种方式属于彼此。当对多个设计元素进行分组时,用户可以根据它们之间的空间大小来决定它们之间的关系。没有间距,用户将很难浏览页面并知道哪些内容相关而哪些内容无关。
张张
2020/05/12
12.1K0
译|CSS中的间距,前端开发中各种设置间距的优点缺点及实例
TensorFlow游乐场及神经网络简介
本文将通过TensorFlow游乐场来快速介绍神经网络的主要功能。TensorFlow游乐场(http://playground.tensorflow.org)是一个通过网页浏览器就可以训练的简单神经网络并实现了可视化训练过程的工具。下图给出了TensorFlow游乐场默认设置的截图。
博文视点Broadview
2020/06/11
7660
【说站】css文字间距的使用
1、letter-spacing是字母间距,每一个汉字和每一个英文字母被当做一个字。
很酷的站长
2022/11/24
6510

相似问题

我如何使用Vuetify间距助手?

12

Vuetify图标大小

54

更改vuetify的字体大小

31

关于更改游乐场纹理的大小

11

itemselector -列的间距大小

19
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档