Next.js+React进门记017【自定义修改Next.js的_app.js文件】

Next.js的_app.js具备许多的功能和作用,网上查找相关信息很少,所以很难全部理解清楚,但大致可以归纳如下:
・可以影响到pages文件夹下所有页面的显示,因此可以设置各页面的共通功能。
・可以获取pages文件夹下所有页面的全局数据(包括用户登录信息、以及其他共通信息等)
・服务器端渲染的设定
・错误处理的设定

计划:将index.js和about页面的计数功能、添加信息功能、背景颜色显示功能的代码分离出来,交给_app.js文件进行管理,使index.js和about页面相互切换时,在无刷新的情况下保持状态同步。

首先,修改index.js页面代码

将以下相关代码分离出来

分离出来的代码,拷贝到_app.js文件里

以上可发现useCounter和useInputArray两个自定义钩子函数管理的状态数据比较冗长,代码输入比较繁琐,因此,可以将这两组状态数据保存到counter和inputArray两个变量中。

保存到counter和inputArray两个变量中并返回

用index.js页面接收_app.js文件传来的状态管理数据

_app.js文件代码更新如下:

import '../styles/globals.css'
import { useCounter } from '../customhooks/useCounter'
import { useInputArray } from '../customhooks/useInputArray'
import { useBgColor } from '../customhooks/useBgColor'

function MyApp({ Component, pageProps }) {
  const counter = useCounter();
  const inputArray = useInputArray();
  useBgColor();
  return <Component {...pageProps} {...counter} {...inputArray} />
}

export default MyApp

index.js页面代码更新如下:

import Head from 'next/head'
import styles from '../styles/Home.module.css'
import { Footer } from '../components/Footer'
import { Main } from '../components/Main'
import { Header } from '../components/Header'

export default function Home(props) {
const {
  bar, 
  isShow, 
  handleClick, 
  handleDisplay, text, array, handleChange, handleAdd} = props;
  
  return (
    <div className={styles.container}>
      <Head>
        <title>Index page</title>
        <link rel="icon" href="/favicon.ico" />
      </Head>
      <Header />
      {isShow ? <h1>{bar}</h1> : null}
      <button  onClick={handleClick}>
      累计按钮
      </button>
      <button onClick={handleDisplay}>
        {isShow ? "不显示" : "显示"}
      </button>
      <button onClick={handleAdd}>追加</button>
      <ul>
        {console.log(array)}
        {array.map(item => {
          return(<li key={item}>{item}</li>);           
        })}
      </ul>
      <input type="text" value={text} onChange={handleChange} />
       <Main page="index"/>
     <Footer />
    </div>
  )
}

和index.js页面一样的方法,修改about.js页面,接收_app.js文件传来的状态管理数据,about.js页面代码更新如下:

import Head from 'next/head'
import styles from '../styles/Home.module.css'
import { Footer } from '../components/Footer'
import { Main } from '../components/Main'
import { Header } from '../components/Header'

export default function About(props) {
  const {
    bar, 
    isShow, 
    handleClick, 
    handleDisplay, text, array, handleChange, handleAdd} = props;

  return (
    <div className={styles.container}>
      <Head>
        <title>About page</title>
        <link rel="icon" href="/favicon.ico" />
      </Head>
       <Header />
       {isShow ? <h1>{bar}</h1> : null}
      <button  onClick={handleClick}>
      累计按钮
      </button>
      <button onClick={handleDisplay}>
        {isShow ? "不显示" : "显示"}
      </button>
      <button onClick={handleAdd}>追加</button>
      <ul>
        {console.log(array)}
        {array.map(item => {
          return(<li key={item}>{item}</li>);           
        })}
      </ul>
      <input type="text" value={text} onChange={handleChange} />
       <Main page="about"/>

     <Footer />
    </div>
  )
}

刷新index.js页面,测试各个功能没问题后,点击About链接切换到about.js页面,about.js页面和index.js页面保持相同状态时,则测试成功。

切换到about.js页面,可发现about.jis页面和index.js页面状态保持一致,至此,计划成功完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值