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 ...
-
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(一)开篇介绍
React与ES6系列: React与ES6(一)开篇介绍 React和ES6(二)ES6的类和ES7的property initializer React与ES6(三)ES6类和方法绑定 React ...
-
真刀实战地搭建React+Webpack+Express搭建一个简易聊天室
一.前面bb两句 因为自惭(自残)webpack配置还不够熟悉,想折腾着做一个小实例熟悉.想着七夕快到了,做一个聊天室自己和自己聊天吧哈哈.好了,可以停止bb了,说一下干货. 二. 这个项目能学到啥? ...
随机推荐
-
NOIP2016普及
还记得去年局部变量忘记置零coin爆零的事......结果我今年又要考一年普及[趴 最近沉迷分块莫队无法自拔,这几天才想起来我是个普及组选手 几乎没准备普及,周六上午抱抱佛脚好了...... 希望能顺 ...
-
DIY一个前端模板引擎.(一)
前端MVVM 模式有点很多,完全摆脱了意大利面条式的代码.个人认为,所有MVVM 的框架基础就是一个高性能的JS模板引擎,它极大简化了 DOM 操作, 使页面渲染和业务逻辑彻底分离.为了理解模板引擎原 ...
-
简述JavaScript函数节流
为什么要用函数节流 浏览器中某些计算和处理要比其他的昂贵很多.例如,DOM 操作比起非 DOM 交互需要更多的内存和 CPU 时间.连续尝试进行过多的 DOM 相关操作可能会导致浏览器挂起,有时候甚至 ...
-
OutputCache 如何使用本地缓存 【转】
注意!ASP.NET MVC 3 的一个 OutputCache 问题 在用 ASP.NET MVC 3 重写博客园网站首页时,特地留意了一下这个缓存问题,通过这篇博文分享一下. 在 ASP.NE ...
-
sql-and、or
WHERE 指令可以被用来由表格中有条件地选取资料. 这个条件可能是简单的 (像上一页的例子),也可能是复杂的.复杂条件是由二或多个简单条件透过 AND 或是 OR 的连接而成.一个 SQL 语句中可 ...
-
Oracle 安装安全补丁过程中出现的问题
为Oracle安装安全补丁,首先在官网上下载相应版本的补丁. 根据官方文档的说明安装,但是在安装的过程中会出项各种各样的错误,这里仅仅把我遇到的记录下来,给大家提供参考. 首先按照官方文档安装. 在这 ...
-
[ios-必看] WWDC 2013 Session笔记 - iOS7中的多任务【转】
感谢:http://onevcat.com/2013/08/ios7-background-multitask/ http://www.objc.io/issue-5/multitasking.htm ...
-
android - gradle编译错误 exit value 1,2,3总结
在使用jenkins,使用gradle编译的时候总会出现一些问题,下面是几个常见问题的解决方法. 被编译的代码或资源有问题( finished with non-zero exit value 1): ...
-
The server time zone value &#39;&#214;&#208;&#185;&#250;&#177;&#234;&#215;&#188;&#202;&#177;&#188;&#228;&#39; is unrecognized or represents more than one time zone.
今天用mysql连接数据库时,出现The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than o ...
-
在IE中下载Office2007文件时在对话框中下载文件变成ZIP文件的问题
导致原因: 从IIS或者Tomcat之类的Web服务器通过二进制流下载文件时(比如通过设置Header为Content-disposition:inline),如果被下载的文件是Office2007的 ...