React Нужна помощь Syncfusion data grid - PullRequest
0 голосов
/ 29 мая 2020

Я новичок в реакции, и я пытаюсь сделать следующее.

Я хочу создать простую форму имени пользователя и пароля, затем добавить данные из формы имени пользователя и пароля и отобразить их в сетке на той же странице. Затем обновляйте сетку каждый раз, когда я добавляю пользователя (имя пользователя и пароль).

Итак, вот моя форма, в которой я получаю только имя пользователя:

        <div >
              <form onSubmit={this.handleSubmit}>
                  <label htmlFor="username">Enter username</label>
                  <input id="username" name="username" type="text" />
                  <button>Send data!</button>
              </form>
            </div>  

Я хочу знать, как именно это делать? Нужно ли мне создавать файл сына, затем отображать его и отображать в сетке? Или я могу просто сохранить его в переменной состояния, а затем отображать каждое обновление? Или для этого есть другое решение?

Изменить: Ниже приведен мой код:

    import React from "react";
    import {GridComponent, ColumnsDirective, Page , Inject} from '@syncfusion/ej2-react-grids';
    import productsApi from './getJson'
    import ddata from '../pages/source.json'


      export default class products extends React.Component  {
        constructor() {

          super();
          this.handleSubmit = this.handleSubmit.bind(this);
          this.state =
                  {
                    QrCode : '',
                    newProducts : []
                  }

              }



              // this one is not working at all
        componentDidMount(){   
          productsApi.getAll().then( data => { 
            this.setState({
              newProducts : data

            } )   
           },
           )


        }

        handleSubmit(event) {
          event.preventDefault();
          this.setState({
            QrCode: event.target.elements.username.value}
            );
        }


        render() {

          return (
          <div >

            <div >
                  <form onSubmit={this.handleSubmit}>
                      <label htmlFor="username">Enter username</label>
                      <input id="username" name="username" type="text" />
                      <button>Send data!</button>
                  </form>
                </div>  



                <div style={{margin: '10%', marginTop : '5%'}}>

                <GridComponent dataSource={ddata}  allowPaging={true} pageSettings= {{pageSize:100}}>

                    <Inject  services ={[Page]}/>
                </GridComponent>
                </div>  

            </div>

          );
        }
      }

Вот мой образец json,

[
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    },
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    },
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    },
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    },
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    },
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    }

]

Надеюсь, вы поможете мне решить эту проблему. Спасибо

Ответы [ 3 ]

0 голосов
/ 29 мая 2020

хорошо, вот мой код:

import React from "react";
import {GridComponent, ColumnsDirective, Page , Inject} from '@syncfusion/ej2-react-grids';
import productsApi from './getJson'
import ddata from '../pages/source.json'


  export default class products extends React.Component  {
    constructor() {

      super();
      this.handleSubmit = this.handleSubmit.bind(this);
      this.state =
              {
                QrCode : '',
                newProducts : []
              }

          }



          // this one is not working at all
    componentDidMount(){   
      productsApi.getAll().then( data => { 
        this.setState({
          newProducts : data

        } )   
       },
       )


    }

    handleSubmit(event) {
      event.preventDefault();
      this.setState({
        QrCode: event.target.elements.username.value}
        );
    }


    render() {

      return (
      <div >

        <div >
              <form onSubmit={this.handleSubmit}>
                  <label htmlFor="username">Enter username</label>
                  <input id="username" name="username" type="text" />
                  <button>Send data!</button>
              </form>
            </div>  



            <div style={{margin: '10%', marginTop : '5%'}}>

            <GridComponent dataSource={ddata}  allowPaging={true} pageSettings= {{pageSize:100}}>

                <Inject  services ={[Page]}/>
            </GridComponent>
            </div>  

        </div>

      );
    }
  }

то, что я здесь делаю, просто получаю json данные из файла и отображаю их в этом рабочем состоянии, но я хочу, чтобы каждый раз Я добавляю пользователя в форму и отправляю акцентные данные в переменную статистики с именем newProducts [], а затем снова отображаю их в своей сетке. код в "componentDidMount ()" - это просто случайный код, я пытался передать данные из файла json в переменную newProducts, чтобы я мог отобразить их в сетке, но он тоже не работает.

вот мой Json файл:

[
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    },
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    },
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    },
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    },
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    },
    {
        "id":0,
        "Qr":1234567891,
        "Stat":"A",
        "name":"Hello world"

    }

]
0 голосов
/ 29 мая 2020

Вот рабочий образец, созданный в Code Sandbox,

Важные вещи:

  • Имя вашего класса должно быть в верхнем регистре, например Product.
  • Поскольку вы не опубликовали файл getJson, я создал файл с данной функцией, который в основном загружает данные из уже решенных. Не дублируйте одни и те же данные с переменной.
  • Затем, поскольку вы используете SyncFusion Grid, создается событие, не используйте ComponentDidMount для первоначальной привязки сетки, используйте созданное событие.
  • Сетка не обновляется автоматически в этом случае, вам нужно использовать способ SyncFusion . Для этого нужно получить ссылку и использовать ее для доступа к экземпляру и вызова refre sh.
  • Вы можете использовать управляемый ввод для текстовых полей вместо использования аргумента события в событии onSubmit.
  • Когда в onSubmit, вы получаете уже связанные элементы, pu sh ваш новый элемент с информацией из текстового поля. Затем обновите состояние и обновите пользовательский интерфейс.
import React from "react";
import {
  GridComponent,
  ColumnsDirective,
  Page,
  Inject
} from "@syncfusion/ej2-react-grids";
import productsApi from "./getJson";

export default class Products extends React.Component {
  constructor() {
    super();
    this.handleSubmit = this.handleSubmit.bind(this);
    this.userNameChanged = this.userNameChanged.bind(this);
    this.created = this.created.bind(this);
    this.grid = null;
    this.state = {
      QrCode: "",
      newProducts: [],
      userName: ""
    };
  }


  handleSubmit(event) {
    event.preventDefault();
    let products = this.state.newProducts;
    products.push({
      id: 0,
      Qr: 1234567891,
      Stat: "A",
      name: this.state.userName
    });
    this.setState({
      newProducts: products
    });
    this.grid.refresh();
  }

  userNameChanged(evt) {
    this.setState({
      userName: evt.target.value
    });
  }

  created(){
    productsApi.getAll().then(data => {
      console.log("x", data);
      this.setState({
        newProducts: data
      });

      this.grid.refresh();
    });
  }

  render() {
    console.log(this.state.newProducts);
    return (
      <div>
        <div>
          <form onSubmit={this.handleSubmit}>
            <label htmlFor="username">Enter username</label>
            <input
              onChange={this.userNameChanged}
              value={this.state.userName}
              id="username"
              name="username"
              type="text"
            />
            <button>Send data!</button>
          </form>
        </div>

        <div style={{ margin: "10%", marginTop: "5%" }}>
          <GridComponent
            ref={g => (this.grid = g)}
            dataSource={this.state.newProducts}
            created={this.created}
            allowPaging={true}
            pageSettings={{ pageSize: 100 }}
          >
            <Inject services={[Page]} />
          </GridComponent>
        </div>
      </div>
    );
  }
}

получить Json файл,

const productsApi = {
  getAll: function() {
    //some ajax request
    return Promise.resolve([
      {
        id: 0,
        Qr: 1234567891,
        Stat: "A",
        name: "Hello world"
      },
      {
        id: 0,
        Qr: 1234567891,
        Stat: "A",
        name: "Hello world"
      },
      {
        id: 0,
        Qr: 1234567891,
        Stat: "A",
        name: "Hello world"
      },
      {
        id: 0,
        Qr: 1234567891,
        Stat: "A",
        name: "Hello world"
      },
      {
        id: 0,
        Qr: 1234567891,
        Stat: "A",
        name: "Hello world"
      },
      {
        id: 0,
        Qr: 1234567891,
        Stat: "A",
        name: "Hello world"
      }
    ]);
  }
};

export default productsApi;

Обновленные коды и ящик, https://codesandbox.io/s/magical-euclid-o7ire

0 голосов
/ 29 мая 2020

Пожалуйста, проверьте этот пример, где я использовал material ui для поля ввода и таблицы.

import React, {useState} from 'react';
import {makeStyles} from '@material-ui/core/styles';
import Table from '@material-ui/core/Table';
import TableBody from '@material-ui/core/TableBody';
import TableCell from '@material-ui/core/TableCell';
import TableContainer from '@material-ui/core/TableContainer';
import TableHead from '@material-ui/core/TableHead';
import TableRow from '@material-ui/core/TableRow';
import Paper from '@material-ui/core/Paper';
import TextField from "@material-ui/core/TextField";
import Button from "@material-ui/core/Button";

export default function FormExample() {
    const [rows, setRows] = useState([]);
    const [row, setRow] = useState({
        username: '',
        password: ''
    });

    function changeHandler(event) {
        setRow({...row, [event.target.name]: event.target.value});
    }

    return (
        <div>
            <form noValidate autoComplete="off">
                <TextField id="username" name="username" label="Username" onChange={changeHandler}/>
                <TextField id="password" name="password" label="Password" onChange={changeHandler}/>
                <Button variant="contained" color="primary" onClick={() => {
                    let data = [...rows];
                    data.push(row);
                    setRows(data);
                }}>
                    Save
                </Button>
            </form>

            <h3>User List</h3>
            <TableContainer component={Paper}>
                <Table aria-label="simple table">
                    <TableHead>
                        <TableRow>
                            <TableCell>Username</TableCell>
                            <TableCell>Password</TableCell>
                        </TableRow>
                    </TableHead>
                    <TableBody>
                        {rows.map((row) => (
                            <TableRow key={row.name}>
                                <TableCell>{row.username}</TableCell>
                                <TableCell>{row.password}</TableCell>
                            </TableRow>
                        ))}
                    </TableBody>
                </Table>
            </TableContainer>
        </div>
    );
}
...