RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 935829
Accepted
Daniil Dubchenko
Daniil Dubchenko
Asked:2020-01-24 02:23:51 +0000 UTC2020-01-24 02:23:51 +0000 UTC 2020-01-24 02:23:51 +0000 UTC

React.router.NavLink + material-ui.Button - 将一个状态传递给另一个

  • 772

material-ui和routing有几个按钮。Button它位于内部NavLink- 通过按下按钮,url 改变,一个组件被隐藏,一个新组件出现 - 这里一切都很好。

但是我想为按钮添加“活动”样式,variant如果Button我们在指向Link. 从理论上讲,这应该不难,但它没有到达那里。我在jsfiddle.net上画了一个小例子。

const options = [
    {
        name: 'Приход',
        link: '/income'
    },
    {
        name: 'Расход',
        link: '/spend'
    },
    {
        name: 'Статистика',
        link: '/statistic'
    }
];

class TodoApp extends React.Component {
  constructor(props) {
    super(props)
    
    this.Router = window.ReactRouterDOM.BrowserRouter
    this.Button = window['material-ui'].Button;
    this.NavLink = window.ReactRouterDOM.NavLink;
    this.Route = window.ReactRouterDOM.Route;
  }
  
  render() {
    return (
            < this.Router >
              <div>
                              {
                    options.map((opt, i) => (
                    //Если ссылка активна, то заменить [variant="contained"] на [variant="outlined"]
                        <this.Button key={i} variant="contained" color="primary">
                            <this.NavLink to={opt.link} >{opt.name}</this.NavLink>
                        </this.Button>
                    ))
                }
                        <hr />

        <this.Route exact path="/income" component={Income} />
        <this.Route path="/spend" component={Spend} />
        <this.Route path="/statistic" component={Statistic} />
              </div>
            </ this.Router>
    )
  }
}

function Income() {
  return (
		<div>
      <h2>Income</h2>
    </div>
  );
}

function Spend() {
  return (
    <div>
      <h2>Spend</h2>
    </div>
  );
}

function Statistic() {
  return (
    <div>
      <h2>Statistic</h2>
    </div>
  );
}
ReactDOM.render(<TodoApp />, document.querySelector("#app"))

javascript
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    meine
    2020-01-24T03:44:50Z2020-01-24T03:44:50Z

    我决定这样做:

    import React, { Component } from "react";
    import PropTypes from "prop-types";
    import { withStyles } from "@material-ui/core/styles";
    import { NavLink } from "react-router-dom";
    import Button from "@material-ui/core/Button";
    
    const packageJSON = [
      {
        name: "Home",
        path: "/"
      },
      {
        name: "About",
        path: "/about"
      },
      {
        name: "Contacts",
        path: "/contacts"
      }
    ];
    
    const styles = theme => ({});
    
    class App extends Component {
      render() {
        const location = window.location.pathname;
        return (
          <>
            <div>
              {packageJSON.map((item, index) => (
                <Button variant={item.path === location ? "outlined" : "contained"} key={index} component={NavLink} exact={item.name === 'Home' ? true : false} to={item.path}>{item.name}</Button>
              ))}
            </div>
          </>
        );
      }
    }
    
    App.propTypes = {
      classes: PropTypes.object.isRequired
    };
    
    export default withStyles(styles)(App);

    PS如果更方便,那就看CodeSandBox

    UPD。评论后

    与主要的starnitsa对接的头,tk。她path = /,但什么也没发生,重新制作path了主页/home,这就是它的结果:

    import React, { Component } from "react";
    import PropTypes from "prop-types";
    import { withStyles } from "@material-ui/core/styles";
    import { NavLink, Switch, Route } from "react-router-dom";
    import Button from "@material-ui/core/Button";
    import Home from "./Home";
    import About from "./About";
    import Contacts from "./Contacts";
    import Test from "./Test";
    
    const packageJSON = [
      {
        name: "Home",
        path: "/home"
      },
      {
        name: "About",
        path: "/about"
      },
      {
        name: "Contacts",
        path: "/contacts"
      }
    ];
    
    const styles = theme => ({
      button: {
        "&:not(:last-child)": { marginRight: 30 }
      }
    });
    
    class App extends Component {
      render() {
        const { classes } = this.props;
        const location = window.location.href;
        console.log(location);
    
        return (
          <>
            <div>
              {packageJSON.map((item, index) => (
                <Button
                  variant={
                    location.indexOf(item.path) !== -1 ? "outlined" : "contained"
                  }
                  key={index}
                  component={NavLink}
                  exact={item.name === "Home" ? true : false}
                  to={item.path}
                  className={classes.button}
                  color="secondary"
                >
                  {item.name}
                </Button>
              ))}
            </div>
            <div>
              <Switch>
                <Route exact path="/home" component={Home} />
                <Route exact path="/about" component={About} />
                <Route exact path="/contacts" component={Contacts} />
                <Route exact path="/contacts/:id" component={Test} />
              </Switch>
            </div>
          </>
        );
      }
    }
    
    App.propTypes = {
      classes: PropTypes.object.isRequired
    };
    
    export default withStyles(styles)(App);

    如果你去,比如说 to /contacts/12,那么按钮Contacts将采用 style outlined,即 你需要的方式。(因此,可以用任何数字/字母/单词等代替 12。)

    PS CodeSandBox 仍在旧链接下。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5