Редактирование строки пользовательского интерфейса материала в React + Redux - PullRequest
0 голосов
/ 09 мая 2018

У меня есть таблица пользовательского интерфейса материала в реактивном проекте, и я хочу, чтобы пользователь щелкнул карандашом / значок редактирования, чтобы отредактировать строку таблицы.

Это загруженный вопрос, но потребует ли он дополнительной части пользовательского интерфейса для материала? Как должна выглядеть логика, чтобы это произошло? У меня большая часть кода настроена на бэкэнд, но я не знаю, как написать этот код в компоненте ???

Спасибо за внимание!

//STYLE VARIABLE BOR MATERIAL BUTTON
const style = {
    margin: 12
    //
};




const mapStateToProps = (state) => ({
    user: state.user,
    reduxState: state.getExpense
});

class ExpenseTable extends Component {
    constructor(props) {
        super(props);

        this.state = {
            getExpense: []
        };
    }

      isSelected = (index) => {
        return this.state.selected.indexOf(index) !== -1;
      };

      handleRowSelection = (selectedRows) => {
        this.setState({
          selected: selectedRows,
        });
      };

    //on page load, DISPATCH GET_EXPENSE is
    //SENT TO expenseSaga which then
    //goes to getExpenseReducer and appends EXPENSE_DATA to the
    //DOM
    componentDidMount() {
        const { id } = this.props.match.params;
        this.props.dispatch({ type: USER_ACTIONS.FETCH_USER });
        this.props.dispatch({ type: 'GET_EXPENSE' });
    }

    componentDidUpdate() {
        if (!this.props.user.isLoading && this.props.user.userName === 
       null) {
            this.props.history.push('home');
        }
    }

    logout = () => {
        this.props.dispatch(triggerLogout());
        // this.props.history.push('home');
    };

    //SETS STATE FOR ALL INPUTS
    handleChange = (name) => {
        return (event) => {
            this.setState({
                [name]: event.target.value
            });
        };
    };

    //SUBMIT BUTTON- TRIGGERS DISPATCH TO EXPENSE SAGA TO ADD DATA
    handleClick = () => {
        console.log('add expense', this.state);
        this.props.dispatch({
            type: 'ADD_EXPENSE',
            payload: this.state
        });
    };


    //TRASH ICON-TRIGGERS DISPATCH TO EXPENSE SAGA DELETE
    handleClickRemove = (id) => {
        console.log('delete expense', this.state);
        this.props.dispatch({
            type: 'DELETE_EXPENSE',
            payload: id
        });
    };

    handleClickEdit = (row) => {
        console.log('edit expense', this.state)
        this.props.dispatch({
            type: 'EDIT_EXPENSE',
            payload: row
        })
    }

    render() {
        console.log('HEY-oooo expense render', this.state);
        let content = null;
        if (this.props.user.userName) {

      //MAP OVER REDUX STATE.

const tableRows = this.props.reduxState.map((row) => {

        //.MAP SEPARATES DATA INTO INDIVIDUAL ITEMS.

                const { id, item_description, purchase_date, 
                item_price, item_link } = row;
                return (
                    <TableRow selectable={false}>
                        {/* TABLE ROWS */}

                        <TableRowColumn>{item_description} 
                        </TableRowColumn>
                        <TableRowColumn>{purchase_date} 
                        </TableRowColumn>
                        <TableRowColumn>${item_price}</TableRowColumn>
                        <TableRowColumn><a href={item_link}>{item_link} 
                        </a></TableRowColumn>
                        <TableRowColumn><EditIcon class="grow:hover" 
                        onClick={() => {this.handleClickEdit(row)}} /> 
                        </TableRowColumn>
                        <TableRowColumn><TrashIcon onClick={() => 
                         {this.handleClickRemove(id);
                        }}/>
                        </TableRowColumn>
                    </TableRow>

                    // END TABLE ROWS
                );
            });

                <div>
                    {/* FORM FOR ADDING EXPENSES(DATA) */}

                    <form id="expenseForm">
                        <h3>
                            Add a new <br />
                            expense
                        </h3>
                        <input
                            type="text"
                            id="fname"
                            name="fname"
                            placeholder="Item description"
                            onChange= 
                            {this.handleChange('item_description')}
                        />

                        <br />

                        <br />
                        <input
                            type="text"
                            id="lname"
                            name="lname"
                            placeholder="Item price"
                            onChange={this.handleChange('item_price')}
                        />
                        <br />
                        <input
                            type="text"
                            id="lname"
                            name="lname"
                            placeholder="Item link"
                            onChange={this.handleChange('item_link')}
                        />
                        <br />

                        {/* END FORM */}

                        <RaisedButton
                            id="expSubmit"
                            label="Submit Expense"
                            primary={true}
                            style={style}
                            onClick={this.handleClick}
                        />
            {/* TABLE TOTAL KEEPS CURRENT TOTAL OF PRICE COLOUMN */}

                        <h1>Total:</h1>
                        <br />
                        <h3>$748.93</h3>
                    </form>


          {/* TABLE HEADERS */}
                    <Table>
                        <TableHeader>
                            <TableRow>
                                <TableHeaderColumn>Item 
                                 description</TableHeaderColumn>
                                <TableHeaderColumn>Purchase 
                                 Date</TableHeaderColumn>
                                <TableHeaderColumn>Item 
                                Price</TableHeaderColumn>
                                <TableHeaderColumn>Item 
                                Link</TableHeaderColumn>
                                <TableHeaderColumn>Edit 
                                entry</TableHeaderColumn>
                                <TableHeaderColumn>Delete 
                           entry</TableHeaderColumn>
                            </TableRow>
                        </TableHeader>

                        <TableBody>
                            {tableRows}
                        </TableBody>
                    </Table>
                </div>
            );
        }

        return (
            <div>
                <Nav />
                {content}
            </div>
        );
    }
}

// this allows us to use <App /> in index.js
export default connect(mapStateToProps)(ExpenseTable);

1 Ответ

0 голосов
/ 21 июня 2018

По умолчанию таблица Material-UI не имеет встроенного редактирования. Вам придется написать свою собственную обертку, чтобы достичь этого, что может занять много времени. Чтобы преодолеть проблему времени, мы можем использовать несколько хороших существующих библиотек. Вот одна мощная библиотека от DevExtreme для той же самой, которую я использовал, но пройдите их лицензирование, прежде чем принять окончательное решение об использовании.

https://devexpress.github.io/devextreme-reactive/react/grid/demos/featured/controlled-mode/

...