【问题标题】:implement BackButton in react-admin在 react-admin 中实现 BackButton
【发布时间】:2019-07-14 07:21:14
【问题描述】:

我需要在react-admin 中实现<BackButton />,例如,当我打开show 页面以获取我需要能够返回list 页面的资源时。

你能指导我实现这个吗? 我不熟悉 react-admin 路由机制。 现在我在我的edit 表单actions 道具中使用这个组件:

const MyActions = ({ basePath, data, resource }) => (
    <CardActions>
        <ShowButton basePath={basePath} record={data} />
        <CloneButton basePath={basePath} record={data} />
        {/* Need <BackButton /> here */}
    </CardActions>
);

export const BookEdit = (props) => (
    <Edit actions={<MyActions />} {...props}>
        <SimpleForm>
            ...
        </SimpleForm>
    </Edit>
);

【问题讨论】:

    标签: reactjs redux react-router material-ui react-admin


    【解决方案1】:

    您可以使用react-router-redux's goBack() function 来实现此目的。

    例如,您的按钮组件将如下所示:

    import React, { Component } from 'react';
    import { connect } from 'react-redux';
    import Button from '@material-ui/core/Button';
    import { goBack } from 'react-router-redux';
    
    class BackButton extends Component {
        handleClick = () => {
            this.props.goBack();
        };
    
        render() {
            return <Button variant="contained" color="primary" onClick={this.handleClick}>Go Back</Button>;
        }
    }
    
    export default connect(null, {
        goBack,
    })(BackButton);
    

    现在在您的CardActions 中使用该按钮组件。

    您可以从an example which uses react-router-redux's push() function in a similar way from the official docs获得帮助。

    【讨论】:

      【解决方案2】:

      创建一个后退按钮。这一个将传递道具和孩子(文本)并直接使用react-router,我认为这更有意义并保持您的代码简单。

      // BackButton.js
      
      import React from 'react'
      import Button from '@material-ui/core/Button'
      import { withRouter } from 'react-router'
      
      const BackButton = ({ history: { goBack }, children, ...props }) => (
        <Button {...props} onClick={goBack}>
          {children}
        </Button>
      )
      
      export default withRouter(BackButton)
      

      示例用法:

      import { Toolbar, SaveButton } from 'react-admin'
      import BackButton from './BackButton'
      
      const SomeToolbar = props => (
        <Toolbar {...props}>
          <SaveButton />
          <BackButton
            variant='outlined'
            color='secondary'
            style={{ marginLeft: '1rem' }}
          >
            Cancel
          </BackButton>
        </Toolbar>
      )
      

      【讨论】:

        【解决方案3】:

        完整的代码如下。

        //BackButton.js
        
        import React, { Component } from 'react';
        import PropTypes from 'prop-types';
        import compose from 'recompose/compose';
        import { withStyles, createStyles } from '@material-ui/core/styles';
        import { translate } from 'ra-core';
        import Button from '@material-ui/core/Button';
        import ArrowBack from '@material-ui/icons/ArrowBack';
        import classnames from 'classnames';
        import { fade } from '@material-ui/core/styles/colorManipulator';
        
        const styles = theme =>
            createStyles({
                deleteButton: {
                    color: theme.palette.error.main,
                    '&:hover': {
                        backgroundColor: fade(theme.palette.error.main, 0.12),
                        // Reset on mouse devices
                        '@media (hover: none)': {
                            backgroundColor: 'transparent',
                        },
                    },
                },
            });
        
        const sanitizeRestProps = ({
            basePath,
            className,
            classes,
            label,
            invalid,
            variant,
            translate,
            handleSubmit,
            handleSubmitWithRedirect,
            submitOnEnter,
            record,
            redirect,
            resource,
            locale,
            ...rest
        }) => rest;
        
        class BackButton extends Component {
          static contextTypes = {
            router: () => true, // replace with PropTypes.object if you use them
          }
        
          static propTypes = {
                  label: PropTypes.string,
                  refreshView: PropTypes.func.isRequired,
                  icon: PropTypes.element,
              };
        
          static defaultProps = {
              label: 'ra.action.back',
              icon: <ArrowBack />,
          };
        
          render() {
            const {
                        className,
                        classes = {},
                        invalid,
                        label = 'ra.action.back',
                        pristine,
                        redirect,
                        saving,
                        submitOnEnter,
                        translate,
                        icon,
                        onClick,
                        ...rest
                    } = this.props;
            return (
              <Button
                    onClick={this.context.router.history.goBack}
                    label={label}
                    className={classnames(
                        'ra-back-button',
                        classes.backButton,
                        className
                    )}
                    key="button"
                    {...sanitizeRestProps(rest)}>
                  {icon} {label && translate(label, { _: label })}
              </Button>
            )
          }
        }
        
        const enhance = compose(
            withStyles(styles),
            translate
        );
        
        export default enhance(BackButton);
        
        //Toolbar.js
        
        import React from 'react';
        import {
            Toolbar,
            SaveButton,
            DeleteButton,
        } from 'react-admin';
        
        import { withStyles } from '@material-ui/core';
        import BackButton from './BackButton'
        
        const toolbarStyles = {
            toolbar: {
                display: 'flex',
                justifyContent: 'space-between',
            },
        };
        
        export const CustomEditToolbar = withStyles(toolbarStyles)(props => (
            <Toolbar {...props}>
                <SaveButton/>
                <DeleteButton/>
                <BackButton/>
            </Toolbar>
        ));
        
        export const CustomCreateToolbar = withStyles(toolbarStyles)(props => (
            <Toolbar {...props}>
                <SaveButton/>
                <BackButton/>
            </Toolbar>
        ));
        

        【讨论】:

        • 帮助提问者包含解释您生成的代码的 cmets。一大段代码可能会让他们感到困惑。
        • 类组件,还是函数组件?下定决心并使用一致的标准。这看起来是由两个不同的地方或作者拼凑而成的,这不是我在拉取请求中接受的代码。
        • 另外,这(与上面列出的其他项目一样)对于我们这些使用 TypeScript 的人来说在语法上无效。
        猜你喜欢
        • 2020-01-20
        • 2021-03-12
        • 2019-07-04
        • 2019-06-16
        • 1970-01-01
        • 2014-02-20
        • 2020-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多