邊學邊寫next.js-2 antd+scss

上次說到路由,如今就要開始寫頁面了!先來一波該系列javascript

react全家桶 

antd一個UI框架,蠻好用的,可是在next裏該如何安裝呢。。。超級簡單,跟前端同樣css

npm install --save antd複製代碼

ok了,開始嘗試一下。前端

修改index.js以下java

import Link from 'next/link'
import Router from 'next/router'
import { Button } from 'antd'

function HomePage() {
  return <div> Welcome to Next.js! <Link href={{ pathname: '/about', query: { name: 'abc' }}}> <a>to about</a> </Link> <br/> <Button onClick={(e) => { Router.push({ pathname: '/about', query: { name: 'abc' }, }) }} >click</Button> </div>
}

export default HomePage複製代碼

進入首頁,node

我去,狀況不對啊。忘了,引入css了,這記性!
react

首頁加入import 'antd/dist/antd.css';webpack

保存,進入首... ,不用了 ,已經報錯了git

全局樣式只能經過pages下的_app.js引入。github

因此新建_app.js啊,可是應該寫什麼呢?這是個問題,到官網去看,確定有解釋。web


能夠看到_app的做用有幾個,最後一條就是咱們的需求。因此整起

刪除index.js裏的

import 'antd/dist/antd.css'; 複製代碼

pages文件夾下新建_app.js

import 'antd/dist/antd.css';

export default function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />;
}複製代碼

對了,第一次建立_app.js得重啓一下才會生效

,熟悉的按鈕回來了。

CSS-in-JS

還有一個點要說下,內聯css

修改about.js以下

import React from 'react'
import { withRouter } from 'next/router'
import Child from '../components/Child'

class About extends React.Component {
  render() {
    return (
      <div> <span>about page! name is : {this.props.router.query.name}</span> <h3>子組件</h3> <Child></Child> <style jsx>{` span { background: red; } `}</style> <style global jsx>{` b { background: orange; } `}</style> </div>

    )
  }
}

export default withRouter(About)複製代碼

上面global,代表不止在該組件生效,同時它的子組件也會生效

在根目錄下穿件components文件夾,進入裏面,新建child.js以下:

import React from 'react'

class Child extends React.Component {
  render() {
    return (
      <div>
      	<span>
	        Child page
	    </span>
	    <br/>
	    <b>
	    	strong
	    </b>
      </div>
    )
  }
}

export default Child複製代碼



scss

查看官網找到git上的next-sass,能夠這樣寫

npm install --save @zeit/next-sass node-sass複製代碼

而後建立next.config.js並寫入

// next.config.js
const withSass = require('@zeit/next-sass')
module.exports = withSass({
  /* config options here */
})複製代碼

以後根目錄建立styles文件夾,並進入建立style.scss寫入

$blue: blue;
div {
	color: $blue;}複製代碼

修改_app.js

_app.js
import 'antd/dist/antd.css';
import '../styles/style.scss';

export default function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />; }複製代碼

修改about.js,並加入猜測,css-in-js是否可以使用到scss

import React from 'react'
import { withRouter } from 'next/router'
import Child from '../components/Child'
import Head from 'next/head'

class About extends React.Component {
  render() {
    return (
      <div>
        <Head>
          <link rel="stylesheet" href="../styles/style.scss"/>
        </Head>
        <div>
          <span>about page! name is : {this.props.router.query.name}</span>
          <h3>子組件</h3>
          <Child></Child>

          <style global jsx>{`
            b {
              background: orange;
              color: $red;
            }
          `}</style>
        </div>
      </div>

    )
  }
}

export default withRouter(About)複製代碼

只要修改過next.config.js,就得重啓一次,因此run一遍把


完。。。蛋玩意兒,有報錯了,antd的css報錯,無法了找一遍爲啥。

config裏寫的貌似有點苗頭可找,withSass難道是隻能解析scss?

git查看next-sass,我去第一句就是

。。。。。。因此看東西仍是得仔細,只能引入一個,這也太坑了吧。

不過,仍是找到了解決方案

npm install --save next-compose-plugins複製代碼

修改next.confit.js

// next.confit.js
const withSass = require('@zeit/next-sass')
const withCss = require('@zeit/next-css');
const withPlugins = require("next-compose-plugins");

module.exports = withPlugins([withSass,withCss], {
  webpack: (config) => {
    return config
  },
});複製代碼

重啓run

,文字顏色變了,可是child裏的strong沒有變成紅色,因此這種方式只適合scss文件使用。那若是想在內部使用又該怎麼辦呢?

進行babelrc配置

根目錄建立.babelrc文件 有點啊,windows右鍵可能建立不了,能夠使用命令行

type null>.babelrc複製代碼

// 寫入一下內容
// .babelrc
{
  "presets": [
    [
      "next/babel",
      {
        "styled-jsx": {
          "plugins": [
            "styled-jsx-plugin-sass"
          ]
        }
      }
    ]
  ]
}複製代碼

修改about.js

// 以上省略
<style global jsx>{`
       $red: red;
            b {
              background: orange;
              color: $red;
            }
          `}</style>
// 如下省略複製代碼

看下效果

,紅了,沒問題。

因爲我的比較喜歡,一個模塊一個樣式,而不是一個大雜燴,因此以爲這樣寫樣式 感受超級超級奇怪,就想有沒有其餘可行的方式。

而後就想到了一個簡單點的方式,把style抽出來,寫成一個js

把about裏的style全刪了

而後修改child.js

import React from 'react'
import Style from './child.style'

class Child extends React.Component {
  render() {
    return (
      <div>
      	<span>
	        Child page
	    </span>
	    <br/>
	    <b>
	    	strong
	    </b>
	    <Style></Style>
      </div>
    )
  }
}

export default Child複製代碼

在components裏新建child.style.js

// child.style.js
export default function () {
  return <style global jsx>{`
            $red: red;
            div {
              b {
                background: orange;
                color: $red;
              }
            }
          `}</style>
}複製代碼

,這樣是可行的。

最重要的是,能夠使用高階組件,讓它在jsx裏面也能夠使用全局變量


最後,原本還想寫rudux的,不過有點長,就不繼續了。

前面給搞忘了,因此就只有如今這個版本的git地址了。。。

github.com/NEOS55555/s…

相關文章
相關標籤/搜索