我有一个使用此堆栈的应用程序:ASP.NET Core MVC+React.JS

Client side view

有一个我一直面临的问题. 我有一个文件Patients.js,它向路由返回一些HTML代码.

Patients.js:

import * as React from 'react';
import {
    Grid,
    Table,
    TableHeaderRow,
    TableSelection,
    TableColumnResizing
  } from '@devexpress/dx-react-grid-material-ui';
import {
    SortingState,
    IntegratedSorting,
    SelectionState,
    IntegratedSelection
  } from '@devexpress/dx-react-grid';
import { useEffect, useState } from "react";
import BaseToolbar from '../Base/BaseToolbar.js'

import '../styles/patients.css';

const URL = '/api/patients';

const columns = [
    { name: 'id', title: 'ID' },
    { name: 'lastName', title: 'Last name' },
    { name: 'firstName', title: 'First name' },
    { name: 'middleName', title: 'Middle name' },
    { name: 'age', title: 'Age' }
];

const defaultColumnWidths = [
    { columnName: 'id', width: 100 },
    { columnName: 'lastName', width: 200 },
    { columnName: 'firstName', width: 200 },
    { columnName: 'middleName', width: 200 },
    { columnName: 'age', width: 100 }
];

let rows = [];
const Patients = () => {
    const [allPatients, setPatients] = useState([]);

    const getPatients = async () => {
        let params = {
            method: 'GET',
            headers: new Headers()
        };
        const result = await fetch(URL, params);

        if (result.ok) {
            const patients =  await result.json();
            setPatients(patients);
            rows = patients;
            return patients;
        }

        return [];
    };

    useEffect(() => {
        getPatients();
    }, []);

    return (
        <div style={{width:'100%'}}>
            <div>
                <BaseToolbar></BaseToolbar>
            </div>
            <div style={{border: '1px LightGrey solid'}}>
                <Grid
                    rows={rows}
                    columns={columns}
                >
                    <SelectionState
                        selection={allPatients}
                        onSelectionChange={setPatients}
                    />
                    <SortingState
                        defaultSorting={[{ columnName: 'id', direction: 'asc' }]}
                        columnExtensions={[{ columnName: 'age', sortingEnabled: false}]}
                    /> 
                    <IntegratedSorting />
                    <IntegratedSelection />
                    <Table />
                    <TableColumnResizing defaultColumnWidths={defaultColumnWidths} />
                    <TableHeaderRow showSortingControls />
                    <TableSelection showSelectAll />
                </Grid>
            </div>
            
        </div>
    );
}

export default Patients;

基本上,您可以看到系统出口保持Patients不变. 在Return操作符中有一个BaseToolbar个html标记. BaseToolbar位于其他文件中:

BaseToolbar.js

import '../styles/buttons.css';
import '../styles/Base/BaseToolbar.css';

const BaseToolbar = () => {
    return (
        <div className='base-toolbar'>
            <button className="base-btn base-btn-sep toolbar-button icon-add">Add</button>
            <button className="base-btn base-btn-sep toolbar-button icon-edit">Edit</button>
            <button className="base-btn base-btn-sep toolbar-button icon-cancel">Remove</button>
        </div>
    );
};

export default BaseToolbar;

所以我的实际问题是:我如何处理这3个按钮的onClick事件?

在我的脑海里,应该是这样的,见下面的编辑:

BaseToolbar.js

<button className="base-btn base-btn-sep toolbar-button icon-add" onClick='onBaseToolbarAddButtonClicked'>Add</button>

Patients.js-返回语句之前的某个位置粘贴处理程序-方法:

function onBaseToolbarAddButtonClicked() {
    // todo: implement me
}

我希望它可以重复用于其他文件.Patients.js并不是唯一的 请给我一个答案,我该怎么做?我的建筑可行吗?你能为我提供什么建筑而不是我的?

推荐答案

我建议更新BaseToolbar,将三个onClick回调处理程序作为props ,分别分配给每个按钮.

const BaseToolbar = ({ onAdd, onEdit, onRemove }) => {
  return (
    <div className='base-toolbar'>
      <button
        className="base-btn base-btn-sep toolbar-button icon-add"
        type="button"
        onClick={onAdd}
      >
        Add
      </button>
      <button
        className="base-btn base-btn-sep toolbar-button icon-edit"
        type="button"
        onClick={onEdit}
      >
        Edit
      </button>
      <button
        className="base-btn base-btn-sep toolbar-button icon-cancel"
        type="button"
        onClick={onRemove}
      >
        Remove
      </button>
    </div>
  );
};

在渲染时Declare并传递这些处理程序BaseToolbar.

const Patients = () => {
  ...

  const AddHandler = () => { .... };
  const EditHandler = () => { .... };
  const RemoveHandler = () => { .... };

  return (
    <div style={{ width: '100%' }}>
      <div>
        <BaseToolbar
          onAdd={AddHandler}
          onEdit={EditHandler}
          onRemove={RemoveHandler}
        />
      </div>
      <div style={{ border: '1px LightGrey solid' }}>
        ...
      </div>
    </div>
  );
}

Asp.net相关问答推荐

Azure DevOps 构建管道正在发布旧的/缓存的构建工件

业务逻辑中的实体框架最佳实践?

如何在 IISExpress 上使用带有 localhost 的子域?

ASP.NET 控件无法在 Visual Studio 2008 的代码隐藏中引用

由于缺少定义,在 .net Core 应用程序上构建失败

有没有办法在外部 javascript 文件中使用<%= someObject.ClientID %>?

RestSharp 不反序列化 JSON 对象列表,始终为 Null

将复选框的值传递给 asp.net mvc4 中的控制器操作

是否有用于 Asp.net 标记的#IF DEBUG?

将通用列表绑定到转发器 - ASP.NET

ASP.NET 中的全局资源与本地资源

回发后 Document.Ready() 不起作用

如何在不预编译的情况下使用命令行msbuild部署VS2012网站项目?

您正在使用哪些身份验证和授权方案 - 为什么?

为什么 HttpWebRequest 会抛出异常而不是返回 HttpStatusCode.NotFound?

在资源文件中使用 HTML

如何判断本地主机

如何直接在 .aspx 页面中访问 web.config 设置?

如何告诉 RadioButtonList 不生成表格

Sys.WebForms.PageRequestManagerServerErrorException:处理服务器上的请求时发生未知错误.