React第一期总结

主要是一些新的写法,和书上不一样,需要在这里保存好,到时直接CP。。:)

由于对eslint的语法检查,没搞好空格和TAB缩进,暂时取消了。

package.json

{
  "name": "react",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack",
    "dev": "webpack-dev-server --hot"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-plugin-transform-object-rest-spread": "^6.26.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "babel-preset-react-hmre": "^1.1.1",
    "eslint": "^4.11.0",
    "eslint-config-airbnb": "^16.1.0",
    "eslint-loader": "^1.9.0",
    "eslint-plugin-import": "^2.8.0",
    "eslint-plugin-jsx": "0.0.2",
    "eslint-plugin-jsx-a11y": "^6.0.2",
    "eslint-plugin-react": "^7.5.1",
    "html-webpack-plugin": "^2.30.1",
    "webpack": "^3.8.1",
    "webpack-dev-server": "^2.9.4"
  },
  "dependencies": {
    "prop-types": "^15.6.0",
    "react": "^16.1.1",
    "react-dom": "^16.1.1"
  }
}

.babelrc

{
	"presets": ["es2015", "react"],
	"plugins": ["transform-object-rest-spread"],
	"env": {
		"development": {
			"presets": ["react-hmre"]
		}
	}
}

.eslintrc

{
	"extends": "airbnb",
	"rules": {
		"comma-dangle": ["error", "never"],
		"linebreak-style": ["error", "windows"],
		"import/no-named-as-default": 0,
		"import/no-named-as-default-member": 0,
		"react/prefer-stateless-function": "off",
		"indent":[1,2],
		"prefer-destructuring": "off"
	},
	"env": {
		"browser": true
	}
}

webpack.config.js

var path = require("path");
var webpack = require("webpack");
var HtmlwebpackPlugin = require("html-webpack-plugin");

var ROOT_PATH = path.resolve(__dirname);
var APP_PATH = path.resolve(ROOT_PATH, "app");
var BUILD_PATH = path.resolve(ROOT_PATH, "build");

module.exports = {
	entry: {
		app: path.resolve(APP_PATH, "app.jsx")
	},
	output: {
		path: BUILD_PATH,
		filename: "bundle.js"
	},
	resolve: {
		extensions: [".js", ".jsx"]
	},
	devtool: "eval-source-map",
	devServer: {
		historyApiFallback: true,
		hot: true,
		inline: true,
		progress: true
	},

	module: {
		rules: [
			{
				test: /\.jsx?$/,
				enforce: "pre",
				//loaders: ["eslint-loader"],
				include: APP_PATH
			},
			{
				test: /\.jsx?$/,
				loaders: ["babel-loader"],
				include: APP_PATH
			}
		]
	},

	plugins: [
		new HtmlwebpackPlugin({
			title: "My first react app",
			template: 'my-index.ejs'
		})
	]
}

my-index.ejs

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
  <div id="container"> </div>
  </body>
</html>

app.jsx

import React from 'react';
import { render } from 'react-dom';
import Profile from './Profile';

const props = {
  name: 'viking',
  age: 20
};
render(<Profile {...props} />, document.getElementById('container'));

App.jsx

import React from 'react';
import PropTypes from 'prop-types';
import Hobby from './Hobby'

const propTypes = {
  name: PropTypes.string.isRequired,
  age: PropTypes.number.isRequired
};

export default class Profile extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      liked: 0,
	  hobbies: ['skateboarding', 'rock music', 'play']
    };
    this.likedCallback = this.likedCallback.bind(this);
	this.addHobbyCallback = this.addHobbyCallback.bind(this);
  }
  likedCallback() {
    let liked = this.state.liked;
    liked += 1;
    this.setState({
      liked
    });
  }
  addHobbyCallback() {
	  let hobbyInput = this.refs.hobby;
	  let val = hobbyInput.value;
	  if (val) {
		  let hobbies = this.state.hobbies;
		  hobbies = [...hobbies, val];
		  this.setState({
			  hobbies
		  }, () => {
			  hobbyInput.value = '';
		  });
	  }
  }
  componentDidMount() {
	  setTimeout(() => {
		  this.likedCallback();
	  }, 1000);
  }
  render() {
    return (
      <div className="profile-component">
        {/* this.props就是传入的属性 */}
        <h1>我的名字叫{this.props.name}</h1>
        <h2>我今年{this.props.age}岁</h2>
        <button onClick={this.likedCallback}>给我点赞</button>
        <h2>总点选数: {this.state.liked}</h2>
		<h2>我的爱好:</h2>
		<ul>
		 {this.state.hobbies.map((hobby, i) => <Hobby key={i} hobby={hobby}  />)}
		</ul>
		<input type="text" ref="hobby" />
		<button onClick={this.addHobbyCallback}>增加爱好</button>
      </div>
    );
  }
}

Profile.propTypes = propTypes;

Hobby.jsx

import React from 'react';
import PropTypes from 'prop-types';

const propTypes = {
	hobby: PropTypes.string.isRequired
};

//class Hobby extends React.Component {
//	render() {
//		return <li> {this.props.hobby}</li>
//	}
//}

function Hobby(props) {
	return <li>{props.hobby}</li>;
}

Hobby.propTypes = propTypes;
export default Hobby;

最后的样子

时间: 2024-10-31 13:55:41

React第一期总结的相关文章

百度站长平台高端SEO俱乐部第一期沙龙活动整理分享

10月26日,由百度站长平台和MADcon联合举办的百度站长平台高端SEO俱乐部第一期沙龙活动圆满落幕.参与本次沙龙交流的业内资深SEOER和百度网页搜索多位高级负责人在轻松的氛围中围绕站长平台.网页搜索和网站安全三个主题展开自由交流.现场的网站负责人们提了很多宝贵的反馈和建议,百度网页搜索团队也就站长们普遍反映的问题一一进行了解答.   以下是本次沙龙交流内容,分享之! 本次沙龙交流问题分类: 1. 页面收录问题 2. 排名和权重问题 3. 站长平台工具-死链工具使用问题 4. 站长平台工具-

IM QQ 改版(第一期)设计总结

  今天的网站改版绝对值得一看!毕竟是上亿人都在用的通讯软件,QQ 官网的改版非同小可,集结了大量顶尖设计师的腾讯设计中心也耗费了相当大的精力,现在将改版过程的经验分享出来,不可多得,别错过咯 >>> 官网作为用户了解一个产品最权威和直接的窗口,应该承载什么样的内容,取决于产品特征和调性.QQ是中国用户量最大的即时通讯件之一,功能越来越细致.丰富,仅仅提供展示和下载产品的信息源当然远远不够.我们迫切希望不仅仅是新品发布,QQ每一次改版的创新功能点,以及越发年轻化的品牌基调都可以更直接有效

第一期逆光剪影后期教程

  第一期逆光剪影教程,希望把教程做下去,每个月都会发一期.下期想学什么教程可以讲出来,尽可能满足大家. 分类: PS图片处理 ps后期处理教程

开发者论坛一周精粹(第十八期) :第一期阿里云高校工作坊申办启动

第十八期(2017年8月7日-2017年8月13日 ) 阿里云高校工作坊是针对大学生推出的众包活动形式,云翼计划 的用户,可申请承办阿里云官方授权的校园活动.通过承办活动,将学校内对云计算感兴趣的同学聚集在一起,沉淀为高校泛技术分享社区. 第一期阿里云高校工作坊申办启动 https://bbs.aliyun.com/read/324006.html [漏洞公告]ThinkPHP缓存函数设计缺陷导致Getshell漏洞 https://bbs.aliyun.com/read/324044.html

秋式开源团队:第一期项目论坛数据库设计文档

秋式开源团队自成立以来,已近快一月时间...... 如需了解团队近一月的工作近况,可看:秋式开源团队:第一期项目论坛进展情况汇报(一) 关注秋式开源团队,留意:http://www.cyqdata.com/qiushi 团队需要激情,更需要坚持,欢迎有激情,能坚持者加入,三分热度者请慎重.   下面为本期论坛数据库设计文档,发布共享,同时也欢迎各界人士多提意见. 论坛:数据库设计文档 数据库名:CYQBBS 序号 表名 说明 1 BBS_Attachment 论坛附件表 2 BBS_Attach

“爱卡十年回馈”第一期开团

"爱卡十年回馈"第一期开团!本次可用)!全网最低价回馈用户!由3M厂家直接发货,绝对保真!告别怠速抖动,清除发动机舱积碳,从未有过的低价,必须不容错过!如果你需要,爱卡承诺最低价!最保真! >>>心动不如行动 点击查看团购详细信息 http://www.xcar.com.cn/bbs/viewthread.php?tid=17145733 爱卡团购价格 产品介绍 ===产品介绍=== [品牌]3M [名称]燃油系统清洁添加剂 [型号]PN07029 [规格]100ml

搜狗联盟站长公社沙龙第一期在北京宏綉会馆成功举办

2013年10月18日下午,搜狗联盟站长公社沙龙第一期在北京宏綉会馆成功举办,主题是:如何正确投放联盟广告.在腾讯向搜狗注资后,"新搜狗"主办的首届主题沙龙活动吸引了行业人士和媒体的广泛关注,除搜狗联盟负责人及工作人员外,华讯财经.振轩网络.114la.钱宝网.战略网等十几家知名网站机构的高管.负责人也参加了本次活动. 搜狗联盟站长公社是由搜狗联盟牵头发起的一个服务于站长群体的组织,旨在给互联网从业者提供一个非盈利性的平台,使从业者可以在平台内实现:沟通.经验分享.资源合作等,帮助站长

搜狗联盟站长公社沙龙第一期成功在京举办

2013年10月18日下午,搜狗联盟站长公社沙龙第一期在北京宏綉会馆成功举办,主题是:如何正确投放联盟广告.在腾讯向搜狗注资后,"新搜狗"主办的首届主题沙龙活动吸引了行业人士和媒体的广泛关注,除搜狗联盟负责人及工作人员外,华讯财经.振轩网络.114la.钱宝网.战略网等十几家知名网站机构的高管.负责人也参加了本次活动. 搜狗联盟站长公社是由搜狗联盟牵头发起的一个服务于站长群体的组织,旨在给http://www.aliyun.com/zixun/aggregation/7324.html

第一期《安徽站长》电子版杂志震撼登场

08安徽互联网年会即将于本周日召开,为了共庆本次安徽互联网的盛会.我们安徽互联网联盟在安徽站长的千呼万唤下组织策划的<安徽站长>第一期杂志电子版经过紧张的赶制终于出炉了,由于本次时间仓促第一期电子版只是简单尝试,希望广大全国站长多提宝贵意见. 我们的口号:我们只关注安徽互联网,安徽站长自己的杂志 我们的栏目:联盟快讯.站长讲座.站长访谈.站长原创.http://www.aliyun.com/zixun/aggregation/10009.html">酷站推荐.站长交流 我们的宗