使用scss + react + webpack + es6實現幻燈片

 

寫在前面:

剛學習完慕課網裏的一個幻燈片案例,本身加了剛學的react,二者結合。首先讓你們看看效果 點擊此處 css

你能夠先用純js實現上面的效果:個人github上的 JS代碼 或者 觀看慕課提供的課程。再趁熱打鐵加上reacthtml

React分析

JS實現node

對於js來講,下面按鈕一點擊,就能根據當前的索引爲按鈕和圖片綁定對應好的樣式:取到對應的DOM元素,加上定義好的樣式名,就能實現綁定效果。react

React實現webpack

但對於React來講,組件化開發的思想,可不是取得DOM元素就了事,由於React設計的初衷就是爲了擺脫DOM。git

那對於這個Demo,如何實現點擊按鈕,上面的圖片對應着變化呢?es6

這個Demo拆成兩個組件,一個圖片組件,一個按鈕。兩個組件共用一個屬性庫,這就解決問題了。只要屬性庫的值變化,兩個組件就都跟着變化github

由於這裏只有一個狀態,因此只要設置一個屬性state.current,但要是應用複雜建議使用數組包含起來。web

首先看一下目錄結構json

//---css   樣式文件
//---data
     //----imgDatas.json   存放圖片信息json文件
//---imgs    圖片存放
//---App.jsx  
//---index.html
//---main.js 
//---package.json
//---webpack.config.js

 

接下來定義一下webpack.config.js

var OpenBrowserPlugin = require('open-browser-webpack-plugin'); //自動打開瀏覽器
var config={
    entry:'./main.js',     //入口文件
    output:{
        path:'./',           //輸出路徑
        filename:'index.js'  //輸出文件
    },
    plugins: [
        new OpenBrowserPlugin({    //自動打開瀏覽器
            url: 'http://localhost:8080'
        })
    ],
    module:{
        loaders:[{
            test:/\.jsx?$/,              //正則匹配 js 文件變化
            exclude:/node_modules/,   
            loader:'babel',
            query:{
                presets:['es2015','react']   //將es6與react變成現代瀏覽器能看懂的語言
            }
        },{
            test:'/\.(png|jpg|woff|woff2)$/',
            loader:'url-loader?limit=8192'     //自動將低於8192bit的圖片變成base64
        },{
            test:/\.json$/,
            loader:'json-loader'      //加載json文件
        }]
    }
};
module.exports = config;

再看一下 package.json文件的內容

  ...
"scripts": {
    "start": "webpack-dev-server"
  },
  ... "dependencies": {
    "babel-core": "^6.10.4",
    "babel-loader": "^6.2.4",
    "babel-preset-es2015": "^6.9.0",
    "babel-preset-react": "^6.11.1",
    "json-loader": "^0.5.4",
    "open-browser-webpack-plugin": "0.0.2",
    "react": "^15.2.0",
    "react-dom": "^15.2.0"
  }

接下來看一下main.js 文件的內容

import React from 'react';
import ReactDOM from 'react-dom';
import Slider from './App.jsx';     //引入APP.jsx

ReactDOM.render(
    <Slider/>,
    document.getElementById('example')
);

最重要的內容是APP.jsx 接下來一塊兒學習重頭戲

思路:

0.將數據引入,經過使用webpack的 json.loader,將json 格式的值讀取,方便後續拿到數據

var imgData = require('./data/imgDatas.json');

//將圖片名信息轉成圖片URL路徑信息
imgData.forEach((item, index)=>{
    item.isRight = index % 2;    //根據奇偶判斷 用於後面識別class="main-i_right"
    item.img = '/imgs/'+item.img;  //jsoan數據加上相對路徑
});

 

 

1.拆分按鈕 templateCtrl 和圖片templateMain 組件

 return (
     <div className="slider">
       <div className="main">
          {templateMain}
       </div>
       <div className="ctrl">
           {templateCtrl}
       </div>
      </div>
);

2.設置getInitialState  current:0 這個是用於判斷當前顯示的值,將會與索引index相比較,相同則ture 添加 class="main-i_active"

//ES5 的React
getInitialState : function(){
        return{
            current : 0
        };
    },

//ES6 的React
constructor(){
        super();
        this.state = {
            current : 0
        };
    }

 

3.根據圖片數據foreach設置templateCtrl templateMain  的props數據,並初始化各自組件中間狀態值isCenter爲false

let templateMain=[],templateCtrl=[];
        imgData.forEach((value , index)=>{
            var center = this.state.current == index; //這是核心,用於根據state.current 與 索引的值相比較 從而給每一個組件的isCenter ture或false 加上對應的active

            templateMain.push(
                <TemplateMainI
                    key={index}
                    {...value} //這裏面有 img    isRight 
                    isCenter={center}
                />
            );
            templateCtrl.push(
                <TemplateCtrlI
                    key={index}
                    src={value.img}
                    isCenter={center}
                    arrange={this.rearrange.bind(this,index)} //經過點擊觸發rearrange,傳遞對應索引 設置state.current
                />
            );
        });

 

 

4.渲染templateCtrl templateMain組件

class TemplateMainI extends React.Component{
    render () {
        const props = this.props,
            mainClassName = (props.isRight?'main-i main-i_right':'main-i')+
                (props.isCenter?' main-i_active':'');

        return(
            <div className={mainClassName}>
                <div className="caption">
                    <h2>{props.h1}</h2>
                    <h3>{props.h2}</h3>
                </div>
                <img src={props.img} alt=""/>
            </div>
        )
    }
}
class TemplateCtrlI extends React.Component{
    render() {
        const props = this.props;
        var ctrlClassName = 'ctrl-i'+ ( props.isCenter ?' ctrl-i_active':'');

        return(
            <a className={ctrlClassName} onClick={props.arrange}>
                <img src={props.src} alt=""/>
            </a>
        )
    }
}

 

5.主方法:rearrange(index) 將選中值的state.current 設置爲那個索引

rearrange(index){
        this.setState({
            current : index
        });
    }

 

6.爲了讓一開始渲染就有畫面呈現,咱們設置  componentDidMount 將第一個畫面設置爲最初始

componentDidMount(){
        this.rearrange(0);
    }

 

接下來對比es6下的React

一、導入文件使用 import React from 'react'

二、var TemplateMainI = React.createClass({}) 寫法變成定義一個類繼承React的組件  class TemplateMainI extends React.Component{}

三、State  

getInitialState : function(){
        return{
            imgsArrangeArr : []
        };
    },

在構造器中繼承父類

es6語法
constructor(){ super();
this.state = { imgsArrangeArr : [] }; }

四、function XXX(){}  變成 es6 方法的寫法  XXX(){}

五、onClick 傳遞到父組件以後,父組件的方法arrange 須要bind this     

this.rearrange.bind(this,index)

 

其中還有不少變化須要細細研究 能夠參考這篇文章

具體代碼能夠研究下個人github地址 Preview_silder,動手作一遍,收益良多。同時很是感謝樓下的博友幫我指出的錯誤。

若是你已經學過了上面的內容,能夠繼續此項目的進階,增長Redux整理數據 React+Redux 實現幻燈片

轉載請註明出處!!!

by 邱XX:http://www.cnblogs.com/QRL909109/p/5683193.html

相關文章
相關標籤/搜索