見出し画像

Next.js + CMS表示作成と、netlifyにデプロイする【作例】 #Next.js #node #javascript


■ 概要:

Next.js関係で。CMSの表示系機能の作成メモとなります
・jsonファイルを読込み。コンテンツ表示する形で
編集機能は、前のindexedDBの編集機能で。
jsonファイルのエクスポートを。読込む形です
・コンテンツ編集は、jsonファイルのみ修正/再デプロイすると
 修正が反映される手順となります。
・デザイン変更等は、next.js deploy (yarn deploy) 必要となります
・投稿入力形式は、MD形式( markdown ) に対応

■ 環境

Next.js : 10.0.0
node 14

■ 参考のコード

■ デモのURL
https://next-cms-kuc.netlify.app/

■ 実装など

・TOP
pages/index.js

export default class Page extends React.Component {
 constructor(props){
   super(props)
   this.state = {items: '', items_org: ''}
//console.log(this.props.data )
 }
 async componentDidMount(){
   var dt = LibCommon.formatDate( new Date(), "YYYY-MM-DD_hhmmss");
   var url = '/cms.json?' + dt
console.log(url )
   const req = await fetch( url );
   const data = await req.json(); 
//console.log(data )
   this.setState({ items: data.items })   
 } 
 tabRow(){
   const items = this.state.items
   if(items instanceof Array){
// console.log(items )
     return items.map((item, index) => {
       return (<IndexRow key={index}
         id={item.id} show_id={item.show_id} title={item.title}
         created_at={item.created_at} />        
       )
     })      
   }
 } 
 render() {
   return (
   <Layout>
     <TopHeadBox />
     <div className="body_main_wrap">
       <div className="container">
         <div className="body_wrap">
           <div id="post_items_box" className="row conte mt-4 mb-4">
             <div className="col-sm-12">
               <div id="div_news">
                 <h2 className="h4_td_title mt-2 mb-2" >Post</h2>
               </div>
             </div>
             {this.tabRow()}
           </div>
         </div>
       </div>
     </div>
   </Layout>
   )
 }
}

・show
pages/[id].js

export default class extends React.Component {
 constructor(props){
   super(props)
   this.state = { title: "", content: "", date:""}
   this.id  = this.props.id
console.log(this.id )
 }
 componentDidMount(){
   this.get_items(this.id)
 } 
 static async getInitialProps(ctx) {
   console.log(ctx.query.id)
   var id = ctx.query.id
     return {
         id: id,
     };
 }     
 async get_items(id){
   try{
     var dt = LibCommon.formatDate( new Date(), "YYYY-MM-DD_hhmmss");
     var url = '/cms.json?' + dt
console.log(url )
     const req = await fetch( url );
     const data = await req.json();
     var items = LibCommon.convert_items(data.items )
     var item  = LibCms.get_show_item( items, String(id) )
     item.content = marked(item.content)
console.log(item )
     this.setState({ 
       title: item.title, 
       content: item.content,
       date : item.created_at
     });        
   } catch (err) {
       console.log(err);
   }
 }  
 render() {
   return (
   <Layout>
     <div className="container">
       <Link href="/" >
         <a className="btn btn-outline-primary mt-2">Back</a>
       </Link>
       <hr className="mt-2 mb-2" />
       <div className="show_head_wrap">
           <i className="fas fa-home"></i> >
           {this.state.title}
       </div>
       <hr />
       <div><h1>{this.state.title}</h1>
       </div>
       date : {this.state.date} <br />  
       <hr />
         <div id="post_item"
         dangerouslySetInnerHTML={{ __html: this.state.content }} />        
     </div>
     <style>{`
     div#post_item > p > img{
       max-width : 100%;
       height : auto;
     }
     div#post_item > hr {
       height: 1px;
       background-color: #000;
       border: none;
     }
     .show_head_wrap{ font-size: 1.4rem; }
     `}</style>      
   </Layout>
   )
 }
}

■ 画面

・index

画像2

・詳細

画像2

■ 関連のページ

cms編集、Vue-CLI版
https://note.com/knaka0209/n/nfbe2ab41a344

Next.jsの ルーティング、リンク設定等の例
https://note.com/knaka0209/n/n6ed079cfbf94

・Next.js初級編 / マガジン



...


いいなと思ったら応援しよう!