scss + react + webpack + es6
scss + react + webpack + es6

写在前面:
刚学习完慕课网里的一个幻灯片案例,自己加了刚学的react,两者结合。首先让大家看看效果 点击此处
你可以先用纯js实现上面的效果:我的github上的 JS代码 或者 观看慕课提供的课程。再趁热打铁加上react
React分析
JS实现
对于js来说,下面按钮一点击,就能根据当前的索引为按钮和图片绑定对应好的样式:取到对应的DOM元素,加上定义好的样式名,就能实现绑定效果。
React实现
但对于React来说,组件化开发的思想,可不是取得DOM元素就了事,因为React设计的初衷就是为了摆脱DOM。
那对于这个Demo,如何实现点击按钮,上面的图片对应着变化呢?
这个Demo拆成两个组件,一个图片组件,一个按钮。两个组件共用一个属性库,这就解决问题了。只要属性库的值变化,两个组件就都跟着变化。
首先看一下目录结构

//---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 接下来一起学习重头戏
思路:
1.拆分按钮 templateCtrl 和图片templateMain 组件

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

2.设置getInitialState imgsArrangeArr:[]
getInitialState : function(){
return{
imgsArrangeArr : []
};
},
3.根据图片数据foreach设置templateCtrl templateMain 的props数据,并初始化各自组件中间状态值isCenter为false

ImgDatas.forEach(function(value , index){
if (!this.state.imgsArrangeArr[index]) {
this.state.imgsArrangeArr[index] = {
isCenter : false
};
}
templateMain.push(
<TemplateMainI
data={value}
center={this.center(index)}
arrange={this.state.imgsArrangeArr[index]}
right={index % 2? true : false}
/>
);
templateCtrl.push(
<TemplateCtrlI
data={value.img}
center={this.center(index)}
arrange={this.state.imgsArrangeArr[index]}
/>
);
}.bind(this));

4.渲染templateCtrl templateMain组件

var TemplateMainI = React.createClass({
render : function(){
var mainClassName = this.props.right?'main-i main-i_right':'main-i';
mainClassName += this.props.arrange.isCenter?' main-i_active':'';
return(
<div className={mainClassName}>
<div className="caption">
<h2>{this.props.data.h1}</h2>
<h3>{this.props.data.h2}</h3>
</div>
<img src={this.props.data.img} alt=""/>
</div>
)
}
});

5.主方法:rearrange(centerIndex) 将选中值的isCenter设置为true,其余设置为false。

rearrange: function(centerIndex){
var imgsArrangeArr = this.state.imgsArrangeArr,
imgsCenterArr = imgsArrangeArr.splice(centerIndex , 1); /*取出那组对应的数组*/
imgsCenterArr[0]={isCenter :true};/*把isCenter置为true*/
for(var i=0; i<imgsArrangeArr.length; i++){
imgsArrangeArr[i] = {isCenter : false}
}
imgsArrangeArr.splice(centerIndex, 0, imgsCenterArr[0]); /*将centerIndex的isCenter变成true*/
this.setState({
imgsArrangeArr:imgsArrangeArr
});
},

接下来对比es6下的React
1、导入文件使用 import React from 'react'
2、var TemplateMainI = React.createClass({}) 写法变成定义一个类继承React的组件 class TemplateMainI extendsReact.Component{}
3、State
getInitialState : function(){
return{
imgsArrangeArr : []
};
},
在构造器中继承父类

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

4、function XXX(){} 变成 es6 方法的写法 XXX(){}
5、onClick={this.handleClick} 需要绑定this onClick={this.handleClick.bind(this)}
其中还有很多变化需要细细研究 可以参考这篇文章
具体代码可以研究下我的github地址 Preview_silder,动手做一遍,收益良多。
scss + react + webpack + es6的更多相关文章
- 使用scss + react + webpack + es6实现幻灯片
写在前面: 刚学习完慕课网里的一个幻灯片案例,自己加了刚学的react,两者结合.首先让大家看看效果 点击此处 你可以先用纯js实现上面的效果:我的github上的 JS代码 或者 观看慕课提供的课程 ...
- 利用yeoman快速搭建React+webpack+es6脚手架
自从前后端开始分离之后,前端项目工程化也显得越来越重要了,之前写过一篇搭建基于Angular+Requirejs+Grunt的前端项目教程,有兴趣的可以点这里去看 但是有些项目可以使用这种方式,但有些 ...
- 配置react+webpack+es6中的一些教训
1.要用es6,因为目前浏览器的支持情况,那么肯定需要插件将e6的代码转换成es5,我用的是babel-loader,事实证明使用6.x版本似乎是不行的,我换成5.3.2之后就成功了. 2.webpa ...
- React+Webpack+ES6环境搭建(自定义框架)
引言 目前React前端框架是今年最火的.而基于React的React Native也迅速发展.React有其独特的组件化功能与JSX的新语法,帮助前端设计有了更好的设计与便捷,而React Nati ...
- React+Webpack+ES6 兼容低版本浏览器(IE9)解决方案
虽然过了兼容IE6的噩梦时代,IE依旧阴魂不散,因为你可能还要兼容IE9.在ES6已经普及的今天,用ES6写react已经成了标配.但是babel编译的js语法,由于某些不规范的写法,可能在IE9下不 ...
- webpack+react+redux+es6开发模式
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- webpack+react+redux+es6
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- webpack+react+redux+es6开发模式---续
一.前言 之前介绍了webpack+react+redux+es6开发模式 ,这个项目对于一个独立的功能节点来说是没有问题的.假如伴随着源源不断的需求,前段项目会涌现出更多的功能节点,需要独立部署运行 ...
- React 和 ES6 工作流之 Webpack的使用(第六部分)
这是React和ECMAScript2015系列文章的最后一篇,我们将继续探索React 和 Webpack的使用. 下面是所有系列文章章节的链接: React . ES6 - 介绍(第一部分) Re ...
随机推荐
- J2EE监听器和过滤器基础
Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文. 监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会 ...
- 【衡阳八中noip模拟题】国色天香
庭前芍药妖无格,池上芙蕖净少情.唯有牡丹真国色,花开时节动京城.——唐·刘禹锡<赏牡丹>芍药花再红终究妖艳无格.终不及牡丹,国色天香.——乌拉那拉氏宜修华妃总是想要用自己的气焰打压皇后,正 ...
- Spring XML 不给提示
a)window – preferences – myeclipse – xml – xml catalog b)User Specified Entries – add i. Location: D ...
- 商品列表中显示类别名称而不是类别ID
商品表中的字段包裹商品信息和categoryid 若要在商品列表中显示出categoryname,有两种做法: 第一种做法: 拿到categoryid后再跟数据库连接一下,然后拿出categoryna ...
- 转:HTML 5 控件事件属性
Window 事件属性 window 对象触发的事件. 适用于 <body> 标签: 属性 值 描述 onafterprint script 在打印文档之后运行脚本 onbeforepri ...
- javascript 数据结构和算法读书笔记 > 第五章 队列
队列是一种列表,但是它只能够在队尾插入元素,在队首删除元素.队列用于存储按照顺序排列的数据,先进先出.而栈则是后入栈的元素反而被优先处理. 实际中一般被应用在进程池.排队操作上面. 1. 队列的操作 ...
- ORM和Core
.net core中有哪些被抛弃的类 1.DataTable DataRow SqlDataAdapter DataRow DataColumn DataColumn 虽然这些类不是我ORM核心功能 ...
- tornado web框架
tornado web框架 tornado简介 1.tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web ...
- Zabbix监控Linux主机设置
说明: Zabbix监控服务端已经配置完成,现在要使用Zabbix对Linux主机进行监控. 具体操作: 以下操作在被监控的Linux主机进行,这里以CentOS 6.x系统为例. 一.配 ...
- C语言单片和C#语言服务器端DES及3DES加密的实现
原文:C语言单片和C#语言服务器端DES及3DES加密的实现 公司最近在做单片机和C#语言的通信.用的是Socket通信.传输的数据是明文,后来 在会上讨论准备用DES加密(对称加密)来做. 双方约定 ...