如何更改每条路线的页面背景颜色
介绍
在本简短指南中,我将向您展示如何为每条路由显示不同的背景颜色。根据特定用例,您可能希望更改应用程序每条路由的背景颜色。在本指南中,我们将学习如何使用现代方法在 React 世界中实现这一点。这还将增强您对 JS 中 CSS 的理解。
以下是我们将在本示例中使用的页面组件。
      function Index() {
  return (
    <>
      <h2>Home</h2>
      <p>This is the Home Page</p>
    </>
  );
}
function About() {
  return (
    <>
      <h2>About</h2>
      <p>This is the About Page</p>
    </>
  );
}
function Users() {
  return (
    <>
      <h2>Users</h2>
      <p>This is the Users Page</p>
    </>
  );
}
    
将路由器添加到我们的项目
我们需要为此示例安装 react-router-dom,因此在命令行实用程序中运行以下命令。
      npm install --save react-router-dom
    
安装后,我们需要从react-router-dom导入。
      import { BrowserRouter as Router, Route, Link } from "react-router-dom";
    
构建根组件
在主组件中,color 属性会根据当前路由变化,颜色的映射如下:
- 主页 -> #282c34
 - 关于页面 -> #9c27b0
 - 用户页面 -> #007bff
 
最后,<App />组件如下所示:
      class App extends Component {
  constructor(props) {
    super(props);
    this.state = { color: "#282c34" };
  }
  // ..
  render() {
    return (
      <div style={{ background: this.state.color }} id="main">
        <Router>
          <div>
            <nav>
              <ul>
                <li>
                  <Link to="/">Home</Link>
                </li>
                <li>
                  <Link to="/about/">About</Link>
                </li>
                <li>
                  <Link to="/users/">Users</Link>
                </li>
              </ul>
            </nav>
            <Route path="/" exact component={Index} />
            <Route path="/about/" component={About} />
            <Route path="/users/" component={Users} />
          </div>
        </Router>
      </div>
    );
  }
}
    
我们将<Router />组件包装在一个 div 中,它是在其 style prop 中具有 backgroundColor 键的主要元素。
我们使用<Route />组件声明每个路由器,使用<Link />组件创建每个路由的链接,并在path属性中指定 URL 键。我们还需要在component属性中指定路由的组件。
在<Link />组件的点击处理函数中,我们改变组件的颜色状态。
      <Link to="/" onClick={() => this.changeColor("#282c34")}>
  Home
</Link>
    
      changeColor = color => {
  this.setState({ color });
};
    
完整代码
本节包含完整的源代码供您参考。
index.js
      import React, { Component } from "react";
import ReactDOM from "react-dom";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import "./styles.css";
function Index() {
  return (
    <>
      <h2>Home</h2>
      <p>This is the Home Page</p>
    </>
  );
}
function About() {
  return (
    <>
      <h2>About</h2>
      <p>This is the About Page</p>
    </>
  );
}
function Users() {
  return (
    <>
      <h2>Users</h2>
      <p>This is the Users Page</p>
    </>
  );
}
class App extends Component {
  constructor(props) {
    super(props);
    this.state = { color: "#282c34" };
  }
  changeColor = color => {
    this.setState({ color });
  };
  render() {
    return (
      <div style={{ background: this.state.color }} id="main">
        <Router>
          <div>
            <nav>
              <ul>
                <li>
                  <Link to="/" onClick={() => this.changeColor("#282c34")}>
                    Home
                  </Link>
                </li>
                <li>
                  <Link
                    to="/about/"
                    onClick={() => this.changeColor("#9c27b0")}
                  >
                    About
                  </Link>
                </li>
                <li>
                  <Link
                    to="/users/"
                    onClick={() => this.changeColor("#007bff")}
                  >
                    Users
                  </Link>
                </li>
              </ul>
            </nav>
            <Route path="/" exact component={Index} />
            <Route path="/about/" component={About} />
            <Route path="/users/" component={Users} />
          </div>
        </Router>
      </div>
    );
  }
}
ReactDOM.render(<App />, document.getElementById("root"));
    
样式.css
      body {
  margin: 0;
  font-family: sans-serif;
}
.App {
  font-family: sans-serif;
  text-align: center;
}
#main {
  height: 100vh;
  padding: 0px 24px;
}
nav ul {
  list-style: none;
  padding: 0px;
}
nav ul li {
  display: inline-block;
  margin: 0px 10px;
}
nav ul li:first-child {
  margin-left: 0px;
}
nav ul li a {
  color: #fff;
}
nav {
  display: flex;
}
h2,
p {
  color: #fff;
}
    
奖励:将类组件重构为函数组件
以前,如果我们想为组件添加状态,我们必须将函数式组件转换为扩展React.Component类的类组件。但是,通过引入钩子,我们可以将状态添加到函数式组件本身。
我们可以使用新的useState()方法向组件添加状态。它接受一个参数,即状态的初始值。它返回一个包含两个元素的数组:状态本身和更新该状态的函数。
因此重构之后,我们的组件将如下所示:
      function App() {
  const [color, changeColor] = useState("#282c34");
  return (
    <div style={{ background: color }} id="main">
      <Router>
        <div>
          <nav>
            <ul>
              <li>
                <Link to="/" onClick={() => changeColor("#282c34")}>
                  Home
                </Link>
              </li>
              <li>
                <Link to="/about/" onClick={() => changeColor("#9c27b0")}>
                  About
                </Link>
              </li>
              <li>
                <Link to="/users/" onClick={() => changeColor("#007bff")}>
                  Users
                </Link>
              </li>
            </ul>
          </nav>
          <Route path="/" exact component={Index} />
          <Route path="/about/" component={About} />
          <Route path="/users/" component={Users} />
        </div>
      </Router>
    </div>
  );
}
    
我们使用数组解构从useState()中检索元素,正如 React 文档中所建议的那样。在onClick处理程序中,我们使用changeColor()函数并将新颜色传递给它。
结论
在本指南中,我们学习了如何通过将颜色存储在状态中并使用 React hooks 通过onClick处理程序对其进行操作来更改路线的背景颜色。希望您在阅读本指南后对 React hooks 有了很好的了解。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
                                
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                
                            
                                    
                                    
                                    
                                    
    
    
            
  
        
请先 登录后发表评论 ~