Nuxt.js Tips
nuxt.jsã®tipsã§ã
componentã«å¤ã渡ãå ´å
éãå´
<template> <MyComponent /> </template> <script> import MyComponent from "~/components/MyComponent.vue" export default { components: { MyComponent } } </scipt>
åãåãå´(MyComponet.vue)
<script> export default { props: { aaa, bbb, ccc } } </script>
åãã§ãã¯ããããå ´å
<script> export default { props: { aaa: String, bbb: Boolean, ccc: Array } } </script>
propsã«ç´æ¥æååãå ¥ããå ´å
<MyComponent :myprop="StringDayo" />
ã¨ããã¨
Raw expression: :myprop="StringDayo"
ã¨ãªã
解決ç
<MyComponent myprop="StringDayo" /> or <MyComponent :myprop="'StringDayo'" />
propsçã®å¤æ°ãhtmlã®è¦ç´ ã«ãããã
<template> <nuxt-link to="this.link"> Link Dayo </nuxt-link> </template> <script> export default { props: { link: String } } </script>
ããã ã¨propsã®linkãå¼ã°ããã«/this.linkã¨ãããªã³ã¯ãåç
§ããã¦ãã¾ã
解決çã¨ãã¦ã¯å¤æ°ã使ãããã¨ãã«ã¯è¦ç´ ã®åã«:ãã¤ãã
<nuxt-link :to="this.link">
ç»åãpropsã¨ãã¦èªã¿è¾¼ã
<template> <div> <img :src="image_src" /> </div> </template> <script> export default { props: { filename: String, }, data() { return { image_src: require(`~/assets/img/${this.filename}`) } } } </script>
methodsã追å ããå ´å
<template> <div class="foobar" @mouseover="mouseOn()" @mouseout="mouseOut()"> hogefuga </div> </template> <script> export default { methods: { mouseOn() { document.getElementById(foobar).style.color = "red"; }, mouseOut() { var img = document.getElementById(foobar); img.style.color = "gray"; } } } </scrip>
ãã¼ã¸èªã¿è¾¼ã¿æã«å¦çãè¡ãããã¨ã
<script> export default { mounted() { alert('foobar'); } } </script>
jsonãã¡ã¤ã«ãèªã¿è¾¼ãã§è¡¨ç¤ºãã
{ "aaa": true "bbb": false "ccc": "hogehoge" }
/pages/test.vue
<script> export default { data() { return { json: require(`static/json/test.json`) } } } </script>
â¼v-for
è¦ç´ ãç¹°ãè¿ããããã¨ãã«ä½¿ã
ä¸ã®jsonãã¡ã¤ã«ã使ã
<template> <div> <ol> <li v-for"(value, index) in json" property1="index" property2="value"></li> </ol> </div> </template> <script> export default { data() { return { json: require(`static/json/test.json`) } } } </script>
v-bind:class
ã¯ã©ã¹å±æ§ãæ¡ä»¶åå²ã§è¨å®ããããªããåãã
<template> <div> <ol> <li v-for"(value, index) in json" v-bindclass="{ active: aaa }"></li> // æç»ããã(aaa === true) <li v-for"(value, index) in json" v-bindclass="{ active: bbb }"></li> // æç»ãããªã(bbb === false) </ol> </div> </template> <script> export default { data() { return { json: require(`static/json/test.json`) } } } </script>
nuxt generateã§åçã«ã¼ãã£ã³ã°ãbuild対象ã«ãã
nuxtã¯_foobar.vueã¨ãã£ãã¢ã³ãã¼ã¹ã³ã¢ã§å§ã¾ãvueãã¡ã¤ã«ãä½ããã¨ã§åçã«ã«ã¼ãã£ã³ã°ãããã¨ãã§ããã
ããããã®åçã«ã¼ãã£ã³ã°ã¯ããã©ã«ãã§nuxt generateã®éçãã¡ã¤ã«ãã«ãã®å¯¾è±¡å¤ã¨ãªã£ã¦ãã
以ä¸ã®ããã«nuxt.config.jsã§æ示çã«æå®ãã¦ãããã¨ã§éçãªã«ã¼ãã£ã³ã°ããã«ãããã
module.exports = { generate: { routes:[ '/hogehoge', '/fuga/fuga' ] } }
ã¾ãããã¡ã¤ã«æ°ãå¤ããªã£ã¦ç´æ¥ç·¨éãé¢åã«ãªã£ãã¨ãã¯ã以ä¸ã®ããã«ãã§ãã
staticãã¡ã¤ã«ä»¥ä¸ã®jsonãã¡ã¤ã«ãèªã¿è¾¼ãã§routingã«è¨å®ãã¦ãã
const fs =require('fs') const filename = fs.readdirSync("./static/").map(x => x.match(/(.*)(?:\.([^.]+$))/)[1]) module.exports = { generate: { routes: filenames } }
ããããªãã¼ãã§éçºãµã¼ãããã¦ã
npm run dev
listen portãéãã
ä¸è¨ã®npm run devã§ãããã°ãµã¼ãããã¦ããã¨ãå¯è½ã«ãªãããããã©ã«ãã§ã¯localhostããããã¢ã¯ã»ã¹ã§ããªãã
ãªã®ã§nuxt.config.jsã§ä»¥ä¸ã®ããã«æå®ãã
module.exports = { server: { host: '0.0.0.0' } }
rss.xmlãè¨å®ãã
nuxt generateæã«rss.xmlãæ´æ°ããæ¹æ³
ã¾ãstatic/rss.xmlãä½ã
<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>My Home Page</title> <link>https://my-home-page.com/</link> <description>ãã®ãã¼ã¸ã¯ã¼ãã®ãã¼ã ãã¼ã¸ãããï¼ï¼ï¼</description> <lastBuildDate>${generate by modules}</lastBuildDate> <language>ja</language> <item> <title>æ¥è¨</title> <link>https://my-home-page/blog/</link> <description>ã¯ããã¦ã®æ¥è¨</description> <pubDate>Fri, 01 Mar 2019 18:00:00 +0900</pubDate> </item> </channel>
ãã®staticãã¡ã¤ã«ã®å
容ã¯ã³ã³ãã¤ã«ãããã«ãã®ã¾ã¾dist以ä¸ã«é
ç½®ãããã®ã§ã
nuxt generateãçµãã£ãæç¹ã§${generate by modules}ã®ã¨ãããæ¸ãæãã¦ããã°ãã
modules/hook/generate.js
require('date-utils') const fs = require ('fs') const now = new Date() const rss = fs.readFileSync("static/rss.xml", "utf-8").replace("<lastBuildDate>${generate by modules}</lastBuildDate>", `<lastBuildDate>${now.toFormat('DDD, DD MMM YYYY HH24:MI:SS +0900')}</lastBuildDate>`) module.exports = function () { this.nuxt.hook('generate:done', async generator => { fs.writeFileSync("dist/rss.xml", rss); }) }
moduleãæ¸ããããnuxt.config.jsã§æå®ãã
module.exports = { modules: [ '@/modules/hook/generate' ] }
bootstrapãèªã¿è¾¼ãéã«äºéã§èªã¿è¾¼ã¾ããã®ãé²ã
nuxt.config.js modules.exports = { modules: [ ['bootstrap-vue/nuxt', { css: false }] ] }
v-if/v-else-if/v-else
ã³ã³ãã¼ãã³ãçã®è¡¨ç¤ºåæ¿ãv-ifçã使ã£ã¦åãæ¿ãããã¨ãã§ãã
<template> <div> <img v-if="this.type==='image'" :src="src"></img> <video v-else-if="this.tyep==='movie'" :src="src" autoplay loop muted></video> <p v-else>missing media</p> </div> </template> <script> export default { props: { type: String, link: String }, data() { return { src: require(`~/assets/img/${this.link}`) } } } </script>
v-forå ã§v-ifã使ã
v-forã¨v-ifãåãè¦ç´ å ã§ä½¿ããã¨ã¯æ¨å¥¨ããã¦ããªã
<template> <div> <div v-for="(value, index) in objects"> <div v-if="value">aaa</div> <div v-if="index===0">bbb</div> </div> </div> </template>
å¤é¨ãªã½ã¼ã¹ãèªã¿è¾¼ã(bootstrapã¨ãjqueryã¨ã)
<script> export default { head () { return { script: [ { src: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js' }, { src: 'https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js' } ], link: [ { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Roboto' } ] } } } </script>
custom layoutãèªã¿è¾¼ã
<script> export default { layout: 'custom' } } </script>
â¼404ãã¼ã¸ã®ä½æ
pages/404/index.vueã«ä½æãã
â¼åçã«ã¼ãã£ã³ã°ã§å¤ãåãåã
pages/_id.vue
<template> <div> {{parameter}} </div> </template> <script> export default { asyncData({ params }) { return { parameter: params.id } } } </script>