前端jquery之后的进阶
来源:互联网 发布:网络方面 证书 编辑:程序博客网 时间:2024/06/01 23:26
AY02————学习了node.js建立服务器
时间的获取:ES6的方法:Date.now()——时间戳
Date.toISOString().substr(0,10) 获取当前日期,格式为“2017-4-15”
——————————————————————————————————————————————
用到了http模块,url(url地址)模块,request模块,cheerio模块
一个简单的爬虫数据的例子:
const http = require("http");
const request = require("request"); // 请求三方模块;
const cheerio = require("cheerio"); //爬虫模块
var data ="";
request("http://www.bilibili.com/",function (err,res,body) {
console.log(res);
if(!err&&res.statusCode==200){
console.log(body)
//加载爬虫爬去的数据
var $=cheerio.load(body);
//取出数据进行赋值
data = $(".m-i-last").html()
}
})
http.createServer((req,res)=>{
// text/plain 字符串数据 text/html 服务器可以解析HTML标签
res.writeHead(200,{"Content-Type":"text/html"});
//数据插入到页面
res.write(data);
res.end();
}).listen(4500,function () { // listen是监听的端口号
console.log("服务器又搭建完毕了")
})
//实时监听服务器的变化 supervisor 三方模块
//npm install -g supervisor
//运行 supervisor 文件名 可以实时监听了
//1.项目搭建的时候要先设置Npm 初始化 npm init
——————————————————————————————————————————————
path模块:
1.path.basename只取最后的文件格式
2.__dirname 输出当前文件的绝对路径
3.path.dirname() == __dirname
4.path.join(__dirname,"doc") 合并路径
——————————————————————————————————————————————
一个用ejs模板搭建的路由
//调用express 模块的方法
// 1.首先要安装 express 全局的
// 2.然后要安装 express 局部的 局部的要有依赖关系
// 3.请求express 模块 调用express的方法
// 4.发起get请求
// 5.使用use方法 设置路由
var express = require("express");
var path = require("path");
var app = express();
// 6.分离路由,每个模块作为单独的模块来引入
var indexRouter = require("./router/index");
var userRouter = require("./router/user");
// 7.全部是用use方法来加载各个模块
app.use("/",indexRouter)
app.use("/user",userRouter)
//设置模板的路径
app.set("views", path.join(__dirname,"views"));
//设置模板的引擎
app.set("view engine","ejs");
// 8.搭建服务器
var server = app.listen(4000,function () {
var port = server.address().port;
console.log("express搭建的服务器完毕了,监听的端口是"+port)
})
//9.安装EJS模板
// npm install --save-dev ejs
————————————————————————————————————————————————————————————————————————————————————————
DAY03————使用了express模板引擎生成项目 ——————————启动项目在文件夹的bin目录下的www文件 命令行:supervisor server www
居中问题:
1、使用弹性盒模型: display:flex; justify-content:center; align-items:center;
2、已知宽高使用定位absolute,使用left以及top属性设置50%减去宽高的一半
3、使用table属性:display:table-cell vertical-align:middle;
双飞翼布局:
两边固定宽度:中间部分自适应:中间部分先显示
css的长度表达式计算: /*calc减号两边一定要加空格*/ 示例:width: calc(100% - 400px);
————————————————————————————————————————————————————————————————————————————————————————
DAY04————登录注册的demo
ejs模板可以通过 <%- include('header')%> 这种方式是项目模块化 <% %> 表达式中可以写js
from表单提交post提交的方式提交的数据存在提交数据的body对象中
redirect是页面重定向的设置
————————————————————————————————————————————————————————————————————————————————————————
DAY05————主要内容移动端的布局,以及SVN的多人协作项目提交冲突的解决方案
normalize.css文件是项目初始化的一个css样式文件
css的整合:@import url("normalize.css"); 通过import整合css资源
@import url("amazeui.min.css");
@import url("active.css");
@import url("common.css");
rem单位的根字体的设置是在html上的font-size设置 :font-size:15.625vw;
而字体大小继承的是body的根字体设置 : 一般设置为 font-size:12px;
SVN多人合作项目提交代码冲突的解决情况的大致步骤:
1.先将自己的代码备份,以防止丢失
2.将代码打开,将代码中自动生成的错误代码信息删除
3.将生成的错误文件删除,
4.将SVN代码库中的文件update下来,对文件夹进行clear
5.最后将自己的代码放入,commit
————————————————————————————————————————————————————————————————————————————————————————
DAY06————mongodb
————————————————————注册的业务逻辑
// 1.请求mongodb服务器模块
var mongodb = require("mongodb");
// 2.搭建mongodb的服务器
function registerDatabase(data){
var server = new mongodb.Server(
// 设置服务器的端口号和主机名
"localhost",
"27017",
// 开启自动连接模式
{
auto_reconnect:true
}
);
// 实例化mongodb模块
var db = mongodb.Db(
"music",
server,
// 以安全模式开启数据库
{
safe:true
}
);
// 3.使用node开启数据库
db.open(function(err,db){
if(err){
console.log('------------------------------------');
console.log(err);
console.log('------------------------------------');
}else{
db.collection(
"albums",
{
safe:true
},
// conn代表就是数据库当前的集合
function(err,conn){
// 数据库查询的方式,转换成数组在控制台显示
// 转换成数组是两个属性 err 值
// conn.find({},{"title":1}).toArray(function(err,item){
// console.log(item);
// // 关闭数据库
// db.close();
// })
conn.insert(data);
}
)
}
})
}
module.exports = registerDatabase;
————————————————————————登录的业务逻辑
router.post('/login', function(req, res, next) {
var result = req.body;
var server = new mongodb.Server(
// 设置服务器的端口号和主机名
"localhost",
"27017",
// 开启自动连接模式
{
auto_reconnect:true
}
);
// 实例化mongodb模块
var db = mongodb.Db(
"music",
server,
// 以安全模式开启数据库
{
safe:true
}
);
// 3.使用node开启数据库
db.open(function(err,db){
if(err){
console.log('------------------------------------');
console.log(err);
console.log('------------------------------------');
}else{
db.collection(
"albums",
{
safe:true
},
// conn代表就是数据库当前的集合
function(err,conn){
// // 数据库查询的方式,转换成数组在控制台显示
// // 转换成数组是两个属性 err 值
// conn.find({},{"title":1}).toArray(function(err,item){
// console.log(item);
// // 关闭数据库
// db.close();
// })
// conn.insert(data);
conn.find(result).toArray(function(err,item){
if(result.userName == item[0].userName && result.passWord == item[0].passWord){
console.log("登录成功");
res.redirect("/");
db.close();
}
})
}
)
}
})
});
————————————————————————————————————————————————————————————————————————————————————————
DAY07————————移动端的触发事件touch.js swiper幻灯片框架
————————————————————————————————————————————————————————————————————————————————————————
DAY08————————iscroll的使用
————————————————————————————————————————————————————————————————————————————————————————
DAY10————————Canvas的使用
随机生成4位数字:
function setRandomNum(max,min){
var arr = [];
for(var i = 0; i < 4; i ++){
arr.push(Math.round(Math.random()*(max -min) + min))
}
console.log(arr);
return arr.join("");
}
canvas的小demo:
var canvas = document.querySelector("canvas"); //获取容器
canvas.setAttribute("width",500);//设置宽度
canvas.setAttribute("height",200);//设置高度
var ctx = canvas.getContext("2d");//设置2d的环境
ctx.fillStyle = "#000";//填充的背景颜色
ctx.fillRect(0,0,500,200);//填充长度
ctx.fill(); //填充
ctx.beginPath();
ctx.fillStyle = "#fff"; //字体的颜色
ctx.font = "50px 微软雅黑";//字体设置
ctx.fillText(setRandomNum(9,0),190,120);//字体的位置 字体的位置是字体的左下角是0,0的位置
ctx.closePath();
————————————————————————————————————————————————————————————————————————————————————————
DAY11————————audio以及video的使用
document.querySelector这是ES5原生自带的选择器
————————————-例:
var audio = document.querySelector("audio");
audio.addEventListener("canplay",function(){
// audio.duration //音频的总时长
// audio.currentTime //当前音频播放的时间
getTime(audio.duration);
//3.使用控制条控制播放进度
$(".rangebox").attr("max",parseInt(audio.duration));
$(".rangebox").change(function(){
$(".curTime").html(getTime($(".rangebox").val()));
audio.currentTime = $(".rangebox").val();
})
$(".allTime").html(getTime(audio.duration));
})
var playStatus = true; //开关状态
$(".play").on("click",function(){
//元素选择器 jquery音频视频必须使用数组结构
if(playStatus){
$("audio")[0].play();
playStatus == false;
$(".allTime").html(getTime(audio.duration));
}else{
$("audio")[0].pause();
playStatus == true;
}
//当前的播放状态
audio.addEventListener("timeupdate",function(){
console.log(audio.currentTime);
$(".curTime").html(getTime(audio.currentTime));
})
})
//静音模块
var metedStatus = true;
$(".muted").on("click",function(){
if(metedStatus){
$("audio")[0].muted = true;
metedStatus = false;
}else{
$("audio")[0].muted = false;
metedStatus = true;
}
})
//格式化事件
function getTime(alltime){
var min = parseInt(alltime / 60),
sec = Math.round(alltime % 60);
if(min < 10){
min = "0" + String(min);
}
if(sec < 10){
sec = "0" + String(sec);
}
var time = min + ":" + sec;
return time;
}
function getlrc(){
$.ajax({
type:"GET",
url:"../public/audio/当你.lrc",
}).done(function(data){
var lrc = data;
var timereg = /\[\d*\:\d*((\.|\:)\d*)*\]/g;
//歌词时间
var timeregArr = lrc.match(timereg);
//歌词文本
var text = lrc.replace(timereg,"");
for(var i = 0; i < timeregArr.length; i ++){
var t = timeregArr[i]
t.match()
}
});
}
————————————————————————————————————————————————————————————————————————————————————————
DAY12————————利用swiper和animate制作微信活动页
————————————————————————————————————————————————————————————————————————————————————————
DAY16————————angular————————todolist
一个angular简单的todolist的小demo
<!DOCTYPE html>
<html lang="en" ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="../node_modules/angular/angular.min.js"></script>
<script>
angular.module("myApp",[])
.controller("myCtrl",['$scope',function($s){
// 原始的数据库表 保证数据的安全
var arr = [
{
name:"马奥博",
done:false
},
{
name:"郑红军",
done:true
},
{
name:"郑红军",
done:true
},
{
name:"郑红军",
done:true
},
{
name:"郑红军",
done:true
},
{
name:"郑红军",
done:true
}
]
$s.todolists = []; //临时表 浅拷贝
for(var i = 0; i<arr.length;i++){
$s.todolists [i] = arr [i]
}
$s.add=function(){
// 通过ng-moduel来映射数据
// 数据做临时的修改
if($s.todolists.todoText){
$s.todolists.push({
name:$s.todolists.todoText,//挂在到数组对象上的属性
done:true
})
$s.todolists.todoText = ""
}
}
$s.active=function(){
//filter 过滤方式只返回 结果 true的
// 过滤出true的数组重新赋值
$s.todolists = $s.todolists.filter(function(item){
return item.done
})
$s.todolists.len = $s.todolists.length;
}
$s.delete=function($index){
//获取当前数组的位置
$s.todolists.splice($index,1)
}
}])
</script>
</head>
<body ng-controller="myCtrl">
<form>
<dl>
<dt>新增人员 <a href="#this" ng-click="active()">已选中 {{todolists.len}}个</a></dt>
<!--通过ng-model 来绑定数组对象上的值-->
<dd><input id="val" type="text" ng-model="todolists.todoText" > <button ng-click="add()"> 增加 </button></dd>
</dl>
</form>
<ul>
<!--解决重复值的bug track by $index-->
<li ng-repeat="items in todolists track by $index">
<span>
<input type="checkbox" ng-model="items.done">
</span>
<span class="done-{{items.done}}">
{{
items.name
}}
</span>
<a href="#this" ng-click="">
修改
</a>
<a href="#this" ng-click="delete($index)">
删除
</a>
</li>
</ul>
<style>
.done-true{
text-decoration: line-through;
}
</style>
</body>
</html>
——————————————————————————————————————————
$scope.$watch方法相当于——$watch方法在用的时候主要是手动的监听一个对象,但对象发生变化时触发某个事件。
$watch(watchFn,watchAction,deepWatch)
watchFn:angular表达式或函数的字符串
watchAction(newValue,oldValue,scope):watchFn发生变化会被调用
deepWatch:可选的布尔值命令检查被监控的对象的每个属性是否发生变化
$watch会返回一个函数,想要注销这个watch可以使用函数
在标签上绑定数据的四种方式:
<p ng-bind="name"></p>
<p ng-cloak>{{name}}</p>
<p ng-bind-template="{{name}}"></p>
<p ng-bind-html="name"></p>
————————————————————————————————————————————————————————————————————————————————————————
DAY18————————angular的路由
——————————ng-router基本配置
main.config(["$routeProvider","$locationProvider",function($routeProvider,$locationProvider){
$routeProvider
.when("/tab1",{
templateUrl:"../view/tab01.html",
controller:"myTab01"
})
.when("/tab2:num",{
templateUrl:"../view/tab02.html",
controller:"myTab02"
})
.otherwise({
redirectTo:"/tab1"
})
}])
————————————————————————————————————————————————————————————————————————————————————————
DAY19————————angular的三大自定义服务——1.factory,service,provider
————————三种自定义服务的区别
1.factory 配置简单处理程序 工厂模式
————————例
m1.factory("myService",function(){
// var obj = {} // 工厂里工人
// obj.name = "王哲" // 工厂里的原料
// obj.age = 90
// return obj; //出厂 产品
return {
name:"王哲"
}
});
m1.factory("youService",function(){
// 隐式返回 默认返回renturn 使用JS垃圾回收机制
// 闭包
return function(max,min){
return Math.random()*(max - min)+min
}
})
// spa single page application;
m1.factory("getData",["$http",function($http){
return function (url) {
$http.jsonp(url).then(function(data){
console.log(data)
})
}
}])
2.service 用面向对象的方式来处理服务
————————例
// service 就是构造函数 面向对象的思想
m1.service("liyingService",Liying)
function Liying (){
this.name ="李英"
this.age=20
}
//原型 protoype 原型链 _proto_
Liying.prototype.num = 100;
Object.prototype.num = 200;
Liying.prototype.say=function () {
console.log( this.name+'今年,'+this.age + "岁,至今未婚,好可爱啊")
}
//原型继承
function Liyingson(){
// this.name ="李英子"
this.run = function(){
console.log(this.name+"边跑边唱")
}
}
Liyingson.prototype = new Liying();
var liyingson = new Liyingson();
3.provider 配置 参数修改数据项 $get 所有服务的底层
————————例
m1.provider("mySetNum",function () {
return {
flag:true,//true 是整数 //false 是小数
init:function (arg) {
if(arg){
this.flag = true
}else{
this.flag = false
}
},
$get:function () {
var _this = this; // 作用域链 (原形链)
return function(max,min){
return _this.flag ? Math.round(Math.random()*(max - min) + min) : Math.random()*(max - min) + min
}
}
}
});
// Provider 所有服务的底层 服务名+Provider
m1.config(["mySetNumProvider",function(mySetNumProvider){
mySetNumProvider.init(true)
}])
// Provider $get config([ 服务名+Provider,function( 服务名+Provider){ } ]) 与 factory return
——————————————————————————————————————————————————————————————————
————作用域之间的通信
1.父controller套用子controller,子controller的$scrope可以使用父controller的,父子之间的通信
2.通过$rootscope全局scope实现通信
3.通过子组件$emit服务上传参数,父组件通过$broadcast广播,实现通信————————通过$on监听事件
4.通过service来通信
————————————四种通信的事例
<!DOCTYPE html>
<html lang="en" ng-app="myapp">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="http://cdn.bootcss.com/angular.js/1.6.3/angular.min.js"></script>
<script>
m1.controller("myCtrl",["$scope",'myService','youService',"getData",'mySetNum','liyingService',function($s,myService,youService,getData,mySetNum,liyingService){
}])
//1 父子之间作用域进行通信
// m1.controller("Parent",["$scope","$rootScope",function($scope,$rootScope){
// // $scope.name = "李英父亲大人"
// }])
// m1.controller("child",["$scope",function($scope){
// }])
//自定义服务 不要加$ 自定义的东西不能加入controller
//2.rootScope 挂在全局作用域上 适用范围更广
// m1.controller("Parent",["$scope","$rootScope",function($scope,$rootScope){
// // $scope.name = "李英父亲大人"
// $scope.name = "李英大人";
// $rootScope.name = $scope.name;
// }])
// m1.controller("child",["$scope",function($scope){
// }])
// 3.基于事件 的数据传递 组件 webcompoents
// m1.controller("Parent",["$scope","$rootScope",function($scope,$rootScope){
// // 父组件来接受数据
// $scope.$on("changName",function(event,data){
// console.log(data);
// //广播事件
// $scope.$broadcast("nohurting",data)
// })
// }])
// m1.controller("child",["$scope",function($scope){
// //子组件发送给父组件,
// $scope.name ="李雪又要挨欺负了"
// $scope.change=function(){
// $scope.$emit("changName","李雪同学不容易啊,李雪的妹妹揍她了")
// }
// }]);
// m1.controller("secChild",["$scope",function($scope){
// $scope.$on("nohurting",function(event,data){
// console.log(data)
// $scope.name = data
// })
// }]);
//4 基于service 进行数据传递
m1.controller("Parent",["$scope","$rootScope",function($scope,$rootScope){
}])
m1.controller("child",["$scope",'myData',function($scope,myData){
$scope.data = myData
}]);
m1.controller("secChild",["$scope",'myData',function($scope,myData){
console.log(myData.name)
$scope.data = myData
}]);
m1.factory("myData",function(){
return {
name :"马奥博大帅哥又撒谎了"
}
})
</script>
</head>
<body ng-controller="myCtrl">
<div ng-controller="Parent">
<div ng-controller="child">
<input type="text" ng-model="data.name" ng-change="change()">
</div>
<div ng-controller="secChild">
<input type="text" ng-model="data.name">
</div>
</div>
</body>
</html>
————————————————————————————————————————————————————————————————————————————————————————
DAY21————————angular的ui-router以及directive的组件模块化开发
————————ui-router的基本配置
main.config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider){
$stateProvider
.state("home",{
url:"/home",
templateUrl:"../view/templates/main.html"
})
.state("home.tab1",{
url:"/tab1",
templateUrl:"../view/templates/tab1.html"
})
.state("home.tab2",{
url:"/tab2",
templateUrl:"../view/templates/tab2.html"
})
$urlRouterProvider.otherwise("home")
}])
——————————directive的组件模块化开发
————————示例:
main.directive("myHeader",function(){
return {
restrict:"A",
replace:true,
scope:{
// myTitle:"@",
myAttr:"="
// myTitle:"&"
},
template:`<header>
<h1>{{title}}</h1>
</header>`,
controller:["$scope",function($scope){
$scope.title = "晓天"
}],
// templateUrl:"../view/templates/header.html"
link:function(scope,element,attr){
console.log(scope);
console.log(element);
console.log(attr);
scope.myAttr = "my-newTitle"
}
}
})
————————————————————————————————————————————————————————————————————————————————————————
DAY22————————ES6的学习以及简单的react使用
let 声明与var let 不指向全局 块记作用域 作用域更加安全
解构赋值————等号左右两边 格式一样 [] = [] , [ [] ] = [ [] ] 字符串特殊 [a,b] = "我是王者"—— (对于set 的解构赋值)
1. 数组的解构赋值,解构赋值 注意事项,左右风格需要统一 都是数组的形式
2.对象的解构赋值
3.字符串解构赋值
4.函数的解构赋值
——————————Symbol。创建一个独一无二的值 不能使用.的形式进行调用 只能使用[] 关联数组的形式进行调用
————————————————————————————————————————————————————————————————————————————————————————
DAY23————————react使用,webpack的简单配置
PropTypes是规定数据类型,常用来校验
——————————webpack的简单配置
module.exports = {
entry:__dirname + "/public/js/main.js",
output:{
path:__dirname + "/app",
filename:"bundle.js"
},
devServer: {
contentBase: "./",//本地服务器所加载的页面所在的目录
colors: true,//终端中输出结果为彩色
historyApiFallback: true,//不跳转
inline: true//实时刷新
},
module:{
loaders:[
{
test:/\.js$/,
loader:"babel-loader",
query:{
presets:["es2015","react"]
}
},{
test:/\.css$/,
loader:"style-loader!css-loader?module"
}
]
}
}
————————————————————————————————————————————————————————————————————————————————————————
DAY25-26————————react制作todolist,以及wabpack的使用,详细配置
————————————todolist的例子
import React, { Component } from 'react';
import ReactDOM , { render } from "react-dom";
import Style from "../css/style.css"
// -----------------------------父组件--------------------------------
class TodoList extends Component {
constructor(props){
super(props);
this.state = {
items : [
{name:"天妈妈1号",done:true},
{name:"天妈妈2号",done:true},
{name:"天妈妈3号",done:true},
{name:"天妈妈4号",done:true},
{name:"天妈妈5号",done:true},
{name:"天妈妈6号",done:true},
{name:"天妈妈7号",done:true},
{name:"天妈妈8号",done:true}
]
}
}
// 更新State
handlechange (items) {
this.setState({
items : items
})
}
render() {
return (
<div>
<Typenew entries={this.state.items} onPush={this.handlechange.bind(this)}/>
<List entries={this.state.items} onDel={this.handlechange.bind(this)}/>
</div>
);
}
}
// -----------------------------输入框组件--------------------------------
class Typenew extends Component {
constructor(props){
super(props);
}
// 新增obj
handlePush (event) {
event.preventDefault();
var items = this.props.entries;
var pushtxt = this.refs.Input.value;
var obj = {};
obj["name"] = pushtxt;
obj["done"] = true;
items.push(obj);
this.props.onPush(items);
}
render() {
return (
<form>
<input type="text" ref="Input" placeholder="请输入要新增的内容"/>
<input type="button" value="新增" onClick={this.handlePush.bind(this)}/>
</form>
);
}
}
// -----------------------------列表组件--------------------------------
class List extends Component {
constructor(props){
super(props);
this.state = {
modify : -1
}
}
// 删除方法
handleDelete (event) {
var index = event.target.getAttribute("data-key");
var items = this.props.entries;
items.splice(index,1);
this.props.onDel(items);
}
// 修改方法,改变模块
handleXiugai (event) {
var index = event.target.getAttribute("data-key");
this.setState({
modify : index
})
}
// input框输入时更新State状态
handleInput (event) {
var index = event.target.getAttribute("data-key");
var items = this.props.entries;
var inputtxt = event.target.value;
items[index].name = inputtxt;
this.props.onDel(items);
}
// 完成更改模块
handleOk () {
this.setState({
modify : -1
})
}
// 复选框的State
handleCheck (event) {
var done = event.target.checked
var index = event.target.getAttribute("data-key");
var items = this.props.entries;
items[index].done = done;
this.props.onDel(items);
}
render() {
return (
<ul>
{
this.props.entries.map(function(value,i){
if(this.state.modify != i){
return (
<li>
<input data-key={i} type="checkbox" ref="checkbox" checked={value.done} onClick={this.handleCheck.bind(this)}/>
<span className={"check-" + value.done}>{value.name}</span>
<button data-key={i} onClick={this.handleXiugai.bind(this)}>修改</button>
<button data-key={i} onClick={this.handleDelete.bind(this)}>删除</button>
</li>
)
}else{
return (
<li>
<input type="checkbox" checked={value.done}/>
<input type="text" data-key={i} onChange={this.handleInput.bind(this)} value={value.name}/>
<button onClick={this.handleOk.bind(this)}>完成</button>
<button data-key={i} onClick={this.handleDelete.bind(this)}>删除</button>
</li>
)
}
}.bind(this))
}
</ul>
);
}
}
render(<TodoList />,document.getElementById("box"))
————————————————————————————————wabpack的使用,详细配置
var webpack = require("webpack");
module.exports = {
devtool:"source-map",
entry: {
main:["webpack/hot/dev-server",__dirname + "/app/main.js"],
app:["webpack/hot/dev-server",__dirname + "/app/app.js"]
},
output:{
path: __dirname + "/build",
filename:"[name].js"
},
module:{
loaders:[
{
test:/\.js$/,
exclude:/node_modules/,
loader:"babel-loader"
},
{
test:/\.css$/,
loader:"style-loader!css-loader"
},
{
test:/\.(jpg|png)$/,
loader:"url-loader?limit=5000000"
}
]
},
plugins:[
new webpack.HotModuleReplacementPlugin(),
new webpack.optimize.UglifyJsPlugin(),
// new webpack.optimize.CommonsChunkPlugin({
// name:"vendor",
// filename:"vendor.min.js"
// })
]
}
————————————————————————————————————————————————————————————————————————————————————————
DAY27-28————————react路由的配置
————————————————————————main.js
import React, { Component } from 'react';
import ReactDOM , { render } from "react-dom";
import {Router, Route, hashHistory,Link,IndexRoute,Redirect} from "react-router"
import App from "./app.js";
import About from "./about.js";
import User from "./user.js";
import Home from "./home.js";
import Style from "../css/header.css";
var doc = document.getElementById("box");
render((
<Router history={hashHistory}>
<Route path="/" component={App}>
<IndexRoute path="/home" component={Home} ></IndexRoute>
<Route path="/home" component={Home}/>
<Route path="/about" component={About}/>
<Route path="/user" component={User}/>
<Redirect from="/about" to="/user"></Redirect>
</Route>
</Router>
),doc)
——————————————————————app.js(配置文件)
import React, { Component } from 'react';
import { Link } from "react-router"
import Style from "../css/header.css";
console.log(Style);
class App extends Component {
render() {
return (
<div>
<header>
{this.props.children}
</header>
<div className="done">
{
this.props.children
}
</div>
<ul>
<li><Link to="/home" activeClassName="play">主页</Link></li>
<li><Link to="/user" activeClassName="play">用户信息</Link></li>
<li><Link to="/about" activeClassName="play">关于我们</Link></li>
</ul>
</div>
);
}
}
export default App;
————————————————————————————————————————————————————————————————————————————————————————
DAY29————————react的生命周期
import React, { Component, PropTypes } from 'react';
import ReactDOM ,{ render } from "react-dom";
import Jquery from "jquery";
window.$ = Jquery
window.jQuery = Jquery;
class App extends Component {
constructor(props) {
// 顺序:2 配置的状态
super(props);
this.state={
// 顺序:3 设置的默认的状态
name : "天孙子"
}
}
componentWillMount() {
// 顺序:4 最后一次修改状态 this.state 然后render
this.setState({
name : "天儿子"
})
}
componentDidMount() {
// 顺序:6 通过jq的ajax请求输入,该周期是ajax的操作
$.get(this.props.source,function(data){
console.log(data);
$(".data").html(data)
})
}
componentWillReceiveProps(nextProps) {
//顺序 8 子组件属性改变 父组件状态修改时触发
}
shouldComponentUpdate(nextProps, nextState) {
//顺序 9 判断是否要重新渲染UI组件 返回值是true /false
}
componentWillUpdate(nextProps, nextState) {
//顺序 10 组件会重新渲染UI
}
componentDidUpdate(prevProps, prevState) {
}
componentWillUnmount() {
//顺序 7 从虚拟DOM节点中移出,插入到真实DOM节点 所有的钩子韩式都被销毁了
}
render() {
// 顺序:5 把DOM节点插入到内存当中
return (
<div>
天妈妈是个{this.props.title}
<div>{this.state.name} 是。。。</div>
<p className="data"></p>
</div>
);
}
}
App.defaultProps = {
// 顺序:1 设置的默认属性
title : "美女"
}
App.propTypes = {
// title : React.props.title.string.isRequired
};
var doc = document.getElementById("box");
render(<App source="http://japi.juhe.cn/comic/category?=&key=239195b2a2e66fc2c8f4fdd177d6d47f"/>,doc)
——————————————————————promiseajax的封装
function ajax(url){
return new Promise (function(resolve,reject){
var xhr = new XMLHttpRequest();
xhr.open("GET",url);
xhr.send();
xhr.onload = resolve; //成功交给resolve
xhr.onerror = reject;//失败交给reject
})
}
ajax("http://api.geihub.com/users/octocat/gists").then(function(data){
console.log(data)
},function(){})
day30===============================================================================
时间的获取:ES6的方法:Date.now()——时间戳
Date.toISOString().substr(0,10) 获取当前日期,格式为“2017-4-15”
——————————————————————————————————————————————
用到了http模块,url(url地址)模块,request模块,cheerio模块
一个简单的爬虫数据的例子:
const http = require("http");
const request = require("request"); // 请求三方模块;
const cheerio = require("cheerio"); //爬虫模块
var data ="";
request("http://www.bilibili.com/",function (err,res,body) {
console.log(res);
if(!err&&res.statusCode==200){
console.log(body)
//加载爬虫爬去的数据
var $=cheerio.load(body);
//取出数据进行赋值
data = $(".m-i-last").html()
}
})
http.createServer((req,res)=>{
// text/plain 字符串数据 text/html 服务器可以解析HTML标签
res.writeHead(200,{"Content-Type":"text/html"});
//数据插入到页面
res.write(data);
res.end();
}).listen(4500,function () { // listen是监听的端口号
console.log("服务器又搭建完毕了")
})
//实时监听服务器的变化 supervisor 三方模块
//npm install -g supervisor
//运行 supervisor 文件名 可以实时监听了
//1.项目搭建的时候要先设置Npm 初始化 npm init
——————————————————————————————————————————————
path模块:
1.path.basename只取最后的文件格式
2.__dirname 输出当前文件的绝对路径
3.path.dirname() == __dirname
4.path.join(__dirname,"doc") 合并路径
——————————————————————————————————————————————
一个用ejs模板搭建的路由
//调用express 模块的方法
// 1.首先要安装 express 全局的
// 2.然后要安装 express 局部的 局部的要有依赖关系
// 3.请求express 模块 调用express的方法
// 4.发起get请求
// 5.使用use方法 设置路由
var express = require("express");
var path = require("path");
var app = express();
// 6.分离路由,每个模块作为单独的模块来引入
var indexRouter = require("./router/index");
var userRouter = require("./router/user");
// 7.全部是用use方法来加载各个模块
app.use("/",indexRouter)
app.use("/user",userRouter)
//设置模板的路径
app.set("views", path.join(__dirname,"views"));
//设置模板的引擎
app.set("view engine","ejs");
// 8.搭建服务器
var server = app.listen(4000,function () {
var port = server.address().port;
console.log("express搭建的服务器完毕了,监听的端口是"+port)
})
//9.安装EJS模板
// npm install --save-dev ejs
————————————————————————————————————————————————————————————————————————————————————————
DAY03————使用了express模板引擎生成项目 ——————————启动项目在文件夹的bin目录下的www文件 命令行:supervisor server www
居中问题:
1、使用弹性盒模型: display:flex; justify-content:center; align-items:center;
2、已知宽高使用定位absolute,使用left以及top属性设置50%减去宽高的一半
3、使用table属性:display:table-cell vertical-align:middle;
双飞翼布局:
两边固定宽度:中间部分自适应:中间部分先显示
css的长度表达式计算: /*calc减号两边一定要加空格*/ 示例:width: calc(100% - 400px);
————————————————————————————————————————————————————————————————————————————————————————
DAY04————登录注册的demo
ejs模板可以通过 <%- include('header')%> 这种方式是项目模块化 <% %> 表达式中可以写js
from表单提交post提交的方式提交的数据存在提交数据的body对象中
redirect是页面重定向的设置
————————————————————————————————————————————————————————————————————————————————————————
DAY05————主要内容移动端的布局,以及SVN的多人协作项目提交冲突的解决方案
normalize.css文件是项目初始化的一个css样式文件
css的整合:@import url("normalize.css"); 通过import整合css资源
@import url("amazeui.min.css");
@import url("active.css");
@import url("common.css");
rem单位的根字体的设置是在html上的font-size设置 :font-size:15.625vw;
而字体大小继承的是body的根字体设置 : 一般设置为 font-size:12px;
SVN多人合作项目提交代码冲突的解决情况的大致步骤:
1.先将自己的代码备份,以防止丢失
2.将代码打开,将代码中自动生成的错误代码信息删除
3.将生成的错误文件删除,
4.将SVN代码库中的文件update下来,对文件夹进行clear
5.最后将自己的代码放入,commit
————————————————————————————————————————————————————————————————————————————————————————
DAY06————mongodb
————————————————————注册的业务逻辑
// 1.请求mongodb服务器模块
var mongodb = require("mongodb");
// 2.搭建mongodb的服务器
function registerDatabase(data){
var server = new mongodb.Server(
// 设置服务器的端口号和主机名
"localhost",
"27017",
// 开启自动连接模式
{
auto_reconnect:true
}
);
// 实例化mongodb模块
var db = mongodb.Db(
"music",
server,
// 以安全模式开启数据库
{
safe:true
}
);
// 3.使用node开启数据库
db.open(function(err,db){
if(err){
console.log('------------------------------------');
console.log(err);
console.log('------------------------------------');
}else{
db.collection(
"albums",
{
safe:true
},
// conn代表就是数据库当前的集合
function(err,conn){
// 数据库查询的方式,转换成数组在控制台显示
// 转换成数组是两个属性 err 值
// conn.find({},{"title":1}).toArray(function(err,item){
// console.log(item);
// // 关闭数据库
// db.close();
// })
conn.insert(data);
}
)
}
})
}
module.exports = registerDatabase;
————————————————————————登录的业务逻辑
router.post('/login', function(req, res, next) {
var result = req.body;
var server = new mongodb.Server(
// 设置服务器的端口号和主机名
"localhost",
"27017",
// 开启自动连接模式
{
auto_reconnect:true
}
);
// 实例化mongodb模块
var db = mongodb.Db(
"music",
server,
// 以安全模式开启数据库
{
safe:true
}
);
// 3.使用node开启数据库
db.open(function(err,db){
if(err){
console.log('------------------------------------');
console.log(err);
console.log('------------------------------------');
}else{
db.collection(
"albums",
{
safe:true
},
// conn代表就是数据库当前的集合
function(err,conn){
// // 数据库查询的方式,转换成数组在控制台显示
// // 转换成数组是两个属性 err 值
// conn.find({},{"title":1}).toArray(function(err,item){
// console.log(item);
// // 关闭数据库
// db.close();
// })
// conn.insert(data);
conn.find(result).toArray(function(err,item){
if(result.userName == item[0].userName && result.passWord == item[0].passWord){
console.log("登录成功");
res.redirect("/");
db.close();
}
})
}
)
}
})
});
————————————————————————————————————————————————————————————————————————————————————————
DAY07————————移动端的触发事件touch.js swiper幻灯片框架
————————————————————————————————————————————————————————————————————————————————————————
DAY08————————iscroll的使用
————————————————————————————————————————————————————————————————————————————————————————
DAY10————————Canvas的使用
随机生成4位数字:
function setRandomNum(max,min){
var arr = [];
for(var i = 0; i < 4; i ++){
arr.push(Math.round(Math.random()*(max -min) + min))
}
console.log(arr);
return arr.join("");
}
canvas的小demo:
var canvas = document.querySelector("canvas"); //获取容器
canvas.setAttribute("width",500);//设置宽度
canvas.setAttribute("height",200);//设置高度
var ctx = canvas.getContext("2d");//设置2d的环境
ctx.fillStyle = "#000";//填充的背景颜色
ctx.fillRect(0,0,500,200);//填充长度
ctx.fill(); //填充
ctx.beginPath();
ctx.fillStyle = "#fff"; //字体的颜色
ctx.font = "50px 微软雅黑";//字体设置
ctx.fillText(setRandomNum(9,0),190,120);//字体的位置 字体的位置是字体的左下角是0,0的位置
ctx.closePath();
————————————————————————————————————————————————————————————————————————————————————————
DAY11————————audio以及video的使用
document.querySelector这是ES5原生自带的选择器
————————————-例:
var audio = document.querySelector("audio");
audio.addEventListener("canplay",function(){
// audio.duration //音频的总时长
// audio.currentTime //当前音频播放的时间
getTime(audio.duration);
//3.使用控制条控制播放进度
$(".rangebox").attr("max",parseInt(audio.duration));
$(".rangebox").change(function(){
$(".curTime").html(getTime($(".rangebox").val()));
audio.currentTime = $(".rangebox").val();
})
$(".allTime").html(getTime(audio.duration));
})
var playStatus = true; //开关状态
$(".play").on("click",function(){
//元素选择器 jquery音频视频必须使用数组结构
if(playStatus){
$("audio")[0].play();
playStatus == false;
$(".allTime").html(getTime(audio.duration));
}else{
$("audio")[0].pause();
playStatus == true;
}
//当前的播放状态
audio.addEventListener("timeupdate",function(){
console.log(audio.currentTime);
$(".curTime").html(getTime(audio.currentTime));
})
})
//静音模块
var metedStatus = true;
$(".muted").on("click",function(){
if(metedStatus){
$("audio")[0].muted = true;
metedStatus = false;
}else{
$("audio")[0].muted = false;
metedStatus = true;
}
})
//格式化事件
function getTime(alltime){
var min = parseInt(alltime / 60),
sec = Math.round(alltime % 60);
if(min < 10){
min = "0" + String(min);
}
if(sec < 10){
sec = "0" + String(sec);
}
var time = min + ":" + sec;
return time;
}
function getlrc(){
$.ajax({
type:"GET",
url:"../public/audio/当你.lrc",
}).done(function(data){
var lrc = data;
var timereg = /\[\d*\:\d*((\.|\:)\d*)*\]/g;
//歌词时间
var timeregArr = lrc.match(timereg);
//歌词文本
var text = lrc.replace(timereg,"");
for(var i = 0; i < timeregArr.length; i ++){
var t = timeregArr[i]
t.match()
}
});
}
————————————————————————————————————————————————————————————————————————————————————————
DAY12————————利用swiper和animate制作微信活动页
————————————————————————————————————————————————————————————————————————————————————————
DAY16————————angular————————todolist
一个angular简单的todolist的小demo
<!DOCTYPE html>
<html lang="en" ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="../node_modules/angular/angular.min.js"></script>
<script>
angular.module("myApp",[])
.controller("myCtrl",['$scope',function($s){
// 原始的数据库表 保证数据的安全
var arr = [
{
name:"马奥博",
done:false
},
{
name:"郑红军",
done:true
},
{
name:"郑红军",
done:true
},
{
name:"郑红军",
done:true
},
{
name:"郑红军",
done:true
},
{
name:"郑红军",
done:true
}
]
$s.todolists = []; //临时表 浅拷贝
for(var i = 0; i<arr.length;i++){
$s.todolists [i] = arr [i]
}
$s.add=function(){
// 通过ng-moduel来映射数据
// 数据做临时的修改
if($s.todolists.todoText){
$s.todolists.push({
name:$s.todolists.todoText,//挂在到数组对象上的属性
done:true
})
$s.todolists.todoText = ""
}
}
$s.active=function(){
//filter 过滤方式只返回 结果 true的
// 过滤出true的数组重新赋值
$s.todolists = $s.todolists.filter(function(item){
return item.done
})
$s.todolists.len = $s.todolists.length;
}
$s.delete=function($index){
//获取当前数组的位置
$s.todolists.splice($index,1)
}
}])
</script>
</head>
<body ng-controller="myCtrl">
<form>
<dl>
<dt>新增人员 <a href="#this" ng-click="active()">已选中 {{todolists.len}}个</a></dt>
<!--通过ng-model 来绑定数组对象上的值-->
<dd><input id="val" type="text" ng-model="todolists.todoText" > <button ng-click="add()"> 增加 </button></dd>
</dl>
</form>
<ul>
<!--解决重复值的bug track by $index-->
<li ng-repeat="items in todolists track by $index">
<span>
<input type="checkbox" ng-model="items.done">
</span>
<span class="done-{{items.done}}">
{{
items.name
}}
</span>
<a href="#this" ng-click="">
修改
</a>
<a href="#this" ng-click="delete($index)">
删除
</a>
</li>
</ul>
<style>
.done-true{
text-decoration: line-through;
}
</style>
</body>
</html>
——————————————————————————————————————————
$scope.$watch方法相当于——$watch方法在用的时候主要是手动的监听一个对象,但对象发生变化时触发某个事件。
$watch(watchFn,watchAction,deepWatch)
watchFn:angular表达式或函数的字符串
watchAction(newValue,oldValue,scope):watchFn发生变化会被调用
deepWatch:可选的布尔值命令检查被监控的对象的每个属性是否发生变化
$watch会返回一个函数,想要注销这个watch可以使用函数
在标签上绑定数据的四种方式:
<p ng-bind="name"></p>
<p ng-cloak>{{name}}</p>
<p ng-bind-template="{{name}}"></p>
<p ng-bind-html="name"></p>
————————————————————————————————————————————————————————————————————————————————————————
DAY18————————angular的路由
——————————ng-router基本配置
main.config(["$routeProvider","$locationProvider",function($routeProvider,$locationProvider){
$routeProvider
.when("/tab1",{
templateUrl:"../view/tab01.html",
controller:"myTab01"
})
.when("/tab2:num",{
templateUrl:"../view/tab02.html",
controller:"myTab02"
})
.otherwise({
redirectTo:"/tab1"
})
}])
————————————————————————————————————————————————————————————————————————————————————————
DAY19————————angular的三大自定义服务——1.factory,service,provider
————————三种自定义服务的区别
1.factory 配置简单处理程序 工厂模式
————————例
m1.factory("myService",function(){
// var obj = {} // 工厂里工人
// obj.name = "王哲" // 工厂里的原料
// obj.age = 90
// return obj; //出厂 产品
return {
name:"王哲"
}
});
m1.factory("youService",function(){
// 隐式返回 默认返回renturn 使用JS垃圾回收机制
// 闭包
return function(max,min){
return Math.random()*(max - min)+min
}
})
// spa single page application;
m1.factory("getData",["$http",function($http){
return function (url) {
$http.jsonp(url).then(function(data){
console.log(data)
})
}
}])
2.service 用面向对象的方式来处理服务
————————例
// service 就是构造函数 面向对象的思想
m1.service("liyingService",Liying)
function Liying (){
this.name ="李英"
this.age=20
}
//原型 protoype 原型链 _proto_
Liying.prototype.num = 100;
Object.prototype.num = 200;
Liying.prototype.say=function () {
console.log( this.name+'今年,'+this.age + "岁,至今未婚,好可爱啊")
}
//原型继承
function Liyingson(){
// this.name ="李英子"
this.run = function(){
console.log(this.name+"边跑边唱")
}
}
Liyingson.prototype = new Liying();
var liyingson = new Liyingson();
3.provider 配置 参数修改数据项 $get 所有服务的底层
————————例
m1.provider("mySetNum",function () {
return {
flag:true,//true 是整数 //false 是小数
init:function (arg) {
if(arg){
this.flag = true
}else{
this.flag = false
}
},
$get:function () {
var _this = this; // 作用域链 (原形链)
return function(max,min){
return _this.flag ? Math.round(Math.random()*(max - min) + min) : Math.random()*(max - min) + min
}
}
}
});
// Provider 所有服务的底层 服务名+Provider
m1.config(["mySetNumProvider",function(mySetNumProvider){
mySetNumProvider.init(true)
}])
// Provider $get config([ 服务名+Provider,function( 服务名+Provider){ } ]) 与 factory return
——————————————————————————————————————————————————————————————————
————作用域之间的通信
1.父controller套用子controller,子controller的$scrope可以使用父controller的,父子之间的通信
2.通过$rootscope全局scope实现通信
3.通过子组件$emit服务上传参数,父组件通过$broadcast广播,实现通信————————通过$on监听事件
4.通过service来通信
————————————四种通信的事例
<!DOCTYPE html>
<html lang="en" ng-app="myapp">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="http://cdn.bootcss.com/angular.js/1.6.3/angular.min.js"></script>
<script>
m1.controller("myCtrl",["$scope",'myService','youService',"getData",'mySetNum','liyingService',function($s,myService,youService,getData,mySetNum,liyingService){
}])
//1 父子之间作用域进行通信
// m1.controller("Parent",["$scope","$rootScope",function($scope,$rootScope){
// // $scope.name = "李英父亲大人"
// }])
// m1.controller("child",["$scope",function($scope){
// }])
//自定义服务 不要加$ 自定义的东西不能加入controller
//2.rootScope 挂在全局作用域上 适用范围更广
// m1.controller("Parent",["$scope","$rootScope",function($scope,$rootScope){
// // $scope.name = "李英父亲大人"
// $scope.name = "李英大人";
// $rootScope.name = $scope.name;
// }])
// m1.controller("child",["$scope",function($scope){
// }])
// 3.基于事件 的数据传递 组件 webcompoents
// m1.controller("Parent",["$scope","$rootScope",function($scope,$rootScope){
// // 父组件来接受数据
// $scope.$on("changName",function(event,data){
// console.log(data);
// //广播事件
// $scope.$broadcast("nohurting",data)
// })
// }])
// m1.controller("child",["$scope",function($scope){
// //子组件发送给父组件,
// $scope.name ="李雪又要挨欺负了"
// $scope.change=function(){
// $scope.$emit("changName","李雪同学不容易啊,李雪的妹妹揍她了")
// }
// }]);
// m1.controller("secChild",["$scope",function($scope){
// $scope.$on("nohurting",function(event,data){
// console.log(data)
// $scope.name = data
// })
// }]);
//4 基于service 进行数据传递
m1.controller("Parent",["$scope","$rootScope",function($scope,$rootScope){
}])
m1.controller("child",["$scope",'myData',function($scope,myData){
$scope.data = myData
}]);
m1.controller("secChild",["$scope",'myData',function($scope,myData){
console.log(myData.name)
$scope.data = myData
}]);
m1.factory("myData",function(){
return {
name :"马奥博大帅哥又撒谎了"
}
})
</script>
</head>
<body ng-controller="myCtrl">
<div ng-controller="Parent">
<div ng-controller="child">
<input type="text" ng-model="data.name" ng-change="change()">
</div>
<div ng-controller="secChild">
<input type="text" ng-model="data.name">
</div>
</div>
</body>
</html>
————————————————————————————————————————————————————————————————————————————————————————
DAY21————————angular的ui-router以及directive的组件模块化开发
————————ui-router的基本配置
main.config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider){
$stateProvider
.state("home",{
url:"/home",
templateUrl:"../view/templates/main.html"
})
.state("home.tab1",{
url:"/tab1",
templateUrl:"../view/templates/tab1.html"
})
.state("home.tab2",{
url:"/tab2",
templateUrl:"../view/templates/tab2.html"
})
$urlRouterProvider.otherwise("home")
}])
——————————directive的组件模块化开发
————————示例:
main.directive("myHeader",function(){
return {
restrict:"A",
replace:true,
scope:{
// myTitle:"@",
myAttr:"="
// myTitle:"&"
},
template:`<header>
<h1>{{title}}</h1>
</header>`,
controller:["$scope",function($scope){
$scope.title = "晓天"
}],
// templateUrl:"../view/templates/header.html"
link:function(scope,element,attr){
console.log(scope);
console.log(element);
console.log(attr);
scope.myAttr = "my-newTitle"
}
}
})
————————————————————————————————————————————————————————————————————————————————————————
DAY22————————ES6的学习以及简单的react使用
let 声明与var let 不指向全局 块记作用域 作用域更加安全
解构赋值————等号左右两边 格式一样 [] = [] , [ [] ] = [ [] ] 字符串特殊 [a,b] = "我是王者"—— (对于set 的解构赋值)
1. 数组的解构赋值,解构赋值 注意事项,左右风格需要统一 都是数组的形式
2.对象的解构赋值
3.字符串解构赋值
4.函数的解构赋值
——————————Symbol。创建一个独一无二的值 不能使用.的形式进行调用 只能使用[] 关联数组的形式进行调用
————————————————————————————————————————————————————————————————————————————————————————
DAY23————————react使用,webpack的简单配置
PropTypes是规定数据类型,常用来校验
——————————webpack的简单配置
module.exports = {
entry:__dirname + "/public/js/main.js",
output:{
path:__dirname + "/app",
filename:"bundle.js"
},
devServer: {
contentBase: "./",//本地服务器所加载的页面所在的目录
colors: true,//终端中输出结果为彩色
historyApiFallback: true,//不跳转
inline: true//实时刷新
},
module:{
loaders:[
{
test:/\.js$/,
loader:"babel-loader",
query:{
presets:["es2015","react"]
}
},{
test:/\.css$/,
loader:"style-loader!css-loader?module"
}
]
}
}
————————————————————————————————————————————————————————————————————————————————————————
DAY25-26————————react制作todolist,以及wabpack的使用,详细配置
————————————todolist的例子
import React, { Component } from 'react';
import ReactDOM , { render } from "react-dom";
import Style from "../css/style.css"
// -----------------------------父组件--------------------------------
class TodoList extends Component {
constructor(props){
super(props);
this.state = {
items : [
{name:"天妈妈1号",done:true},
{name:"天妈妈2号",done:true},
{name:"天妈妈3号",done:true},
{name:"天妈妈4号",done:true},
{name:"天妈妈5号",done:true},
{name:"天妈妈6号",done:true},
{name:"天妈妈7号",done:true},
{name:"天妈妈8号",done:true}
]
}
}
// 更新State
handlechange (items) {
this.setState({
items : items
})
}
render() {
return (
<div>
<Typenew entries={this.state.items} onPush={this.handlechange.bind(this)}/>
<List entries={this.state.items} onDel={this.handlechange.bind(this)}/>
</div>
);
}
}
// -----------------------------输入框组件--------------------------------
class Typenew extends Component {
constructor(props){
super(props);
}
// 新增obj
handlePush (event) {
event.preventDefault();
var items = this.props.entries;
var pushtxt = this.refs.Input.value;
var obj = {};
obj["name"] = pushtxt;
obj["done"] = true;
items.push(obj);
this.props.onPush(items);
}
render() {
return (
<form>
<input type="text" ref="Input" placeholder="请输入要新增的内容"/>
<input type="button" value="新增" onClick={this.handlePush.bind(this)}/>
</form>
);
}
}
// -----------------------------列表组件--------------------------------
class List extends Component {
constructor(props){
super(props);
this.state = {
modify : -1
}
}
// 删除方法
handleDelete (event) {
var index = event.target.getAttribute("data-key");
var items = this.props.entries;
items.splice(index,1);
this.props.onDel(items);
}
// 修改方法,改变模块
handleXiugai (event) {
var index = event.target.getAttribute("data-key");
this.setState({
modify : index
})
}
// input框输入时更新State状态
handleInput (event) {
var index = event.target.getAttribute("data-key");
var items = this.props.entries;
var inputtxt = event.target.value;
items[index].name = inputtxt;
this.props.onDel(items);
}
// 完成更改模块
handleOk () {
this.setState({
modify : -1
})
}
// 复选框的State
handleCheck (event) {
var done = event.target.checked
var index = event.target.getAttribute("data-key");
var items = this.props.entries;
items[index].done = done;
this.props.onDel(items);
}
render() {
return (
<ul>
{
this.props.entries.map(function(value,i){
if(this.state.modify != i){
return (
<li>
<input data-key={i} type="checkbox" ref="checkbox" checked={value.done} onClick={this.handleCheck.bind(this)}/>
<span className={"check-" + value.done}>{value.name}</span>
<button data-key={i} onClick={this.handleXiugai.bind(this)}>修改</button>
<button data-key={i} onClick={this.handleDelete.bind(this)}>删除</button>
</li>
)
}else{
return (
<li>
<input type="checkbox" checked={value.done}/>
<input type="text" data-key={i} onChange={this.handleInput.bind(this)} value={value.name}/>
<button onClick={this.handleOk.bind(this)}>完成</button>
<button data-key={i} onClick={this.handleDelete.bind(this)}>删除</button>
</li>
)
}
}.bind(this))
}
</ul>
);
}
}
render(<TodoList />,document.getElementById("box"))
————————————————————————————————wabpack的使用,详细配置
var webpack = require("webpack");
module.exports = {
devtool:"source-map",
entry: {
main:["webpack/hot/dev-server",__dirname + "/app/main.js"],
app:["webpack/hot/dev-server",__dirname + "/app/app.js"]
},
output:{
path: __dirname + "/build",
filename:"[name].js"
},
module:{
loaders:[
{
test:/\.js$/,
exclude:/node_modules/,
loader:"babel-loader"
},
{
test:/\.css$/,
loader:"style-loader!css-loader"
},
{
test:/\.(jpg|png)$/,
loader:"url-loader?limit=5000000"
}
]
},
plugins:[
new webpack.HotModuleReplacementPlugin(),
new webpack.optimize.UglifyJsPlugin(),
// new webpack.optimize.CommonsChunkPlugin({
// name:"vendor",
// filename:"vendor.min.js"
// })
]
}
————————————————————————————————————————————————————————————————————————————————————————
DAY27-28————————react路由的配置
————————————————————————main.js
import React, { Component } from 'react';
import ReactDOM , { render } from "react-dom";
import {Router, Route, hashHistory,Link,IndexRoute,Redirect} from "react-router"
import App from "./app.js";
import About from "./about.js";
import User from "./user.js";
import Home from "./home.js";
import Style from "../css/header.css";
var doc = document.getElementById("box");
render((
<Router history={hashHistory}>
<Route path="/" component={App}>
<IndexRoute path="/home" component={Home} ></IndexRoute>
<Route path="/home" component={Home}/>
<Route path="/about" component={About}/>
<Route path="/user" component={User}/>
<Redirect from="/about" to="/user"></Redirect>
</Route>
</Router>
),doc)
——————————————————————app.js(配置文件)
import React, { Component } from 'react';
import { Link } from "react-router"
import Style from "../css/header.css";
console.log(Style);
class App extends Component {
render() {
return (
<div>
<header>
{this.props.children}
</header>
<div className="done">
{
this.props.children
}
</div>
<ul>
<li><Link to="/home" activeClassName="play">主页</Link></li>
<li><Link to="/user" activeClassName="play">用户信息</Link></li>
<li><Link to="/about" activeClassName="play">关于我们</Link></li>
</ul>
</div>
);
}
}
export default App;
————————————————————————————————————————————————————————————————————————————————————————
DAY29————————react的生命周期
import React, { Component, PropTypes } from 'react';
import ReactDOM ,{ render } from "react-dom";
import Jquery from "jquery";
window.$ = Jquery
window.jQuery = Jquery;
class App extends Component {
constructor(props) {
// 顺序:2 配置的状态
super(props);
this.state={
// 顺序:3 设置的默认的状态
name : "天孙子"
}
}
componentWillMount() {
// 顺序:4 最后一次修改状态 this.state 然后render
this.setState({
name : "天儿子"
})
}
componentDidMount() {
// 顺序:6 通过jq的ajax请求输入,该周期是ajax的操作
$.get(this.props.source,function(data){
console.log(data);
$(".data").html(data)
})
}
componentWillReceiveProps(nextProps) {
//顺序 8 子组件属性改变 父组件状态修改时触发
}
shouldComponentUpdate(nextProps, nextState) {
//顺序 9 判断是否要重新渲染UI组件 返回值是true /false
}
componentWillUpdate(nextProps, nextState) {
//顺序 10 组件会重新渲染UI
}
componentDidUpdate(prevProps, prevState) {
}
componentWillUnmount() {
//顺序 7 从虚拟DOM节点中移出,插入到真实DOM节点 所有的钩子韩式都被销毁了
}
render() {
// 顺序:5 把DOM节点插入到内存当中
return (
<div>
天妈妈是个{this.props.title}
<div>{this.state.name} 是。。。</div>
<p className="data"></p>
</div>
);
}
}
App.defaultProps = {
// 顺序:1 设置的默认属性
title : "美女"
}
App.propTypes = {
// title : React.props.title.string.isRequired
};
var doc = document.getElementById("box");
render(<App source="http://japi.juhe.cn/comic/category?=&key=239195b2a2e66fc2c8f4fdd177d6d47f"/>,doc)
——————————————————————promiseajax的封装
function ajax(url){
return new Promise (function(resolve,reject){
var xhr = new XMLHttpRequest();
xhr.open("GET",url);
xhr.send();
xhr.onload = resolve; //成功交给resolve
xhr.onerror = reject;//失败交给reject
})
}
ajax("http://api.geihub.com/users/octocat/gists").then(function(data){
console.log(data)
},function(){})
day30===============================================================================
0 0
- 前端jquery之后的进阶
- Web前端——JQuery的进阶(测试使用 jQuery进行指定的操作)
- 【前端学习笔记】JQuery事件细节、JQ进阶常用方法
- Web前端——JQuery的进阶(动态的显示某个div控件,选择器的构建)
- 前端工程师的CI进阶之路
- 关于前端进阶的头三年计划书
- 前端工程师的进阶之路
- 前端的 jQuery 小技巧
- 使用JQuery的前端验证
- jQuery使用clone之后的datepicker问题
- 前端基础进阶(十一):详细图解jQuery对象,以及如何扩展jQuery插件
- 前端基础进阶(八):详细图解jQuery对象,以及如何扩展jQuery插件
- jQuery 快速进阶要浏览的网站
- 前端通信进阶
- 前端通信进阶
- Gulp-前端进阶A
- web前端进阶书单
- web前端进阶路程
- dede中php标签用法
- vb.net 教程 5-13 图像处理之像素处理 6
- 动态规划总结
- 有关线程的相关知识(上)
- 计算机操作系统-磁盘存储器的管理
- 前端jquery之后的进阶
- ubuntu16.04 编译安装php7,增加 pthreads 多线程控制器
- 机器视觉开源库学习
- 文章标题
- [NEERC13.H][ST表][乱搞]Hack Protection
- 区域内点的个数
- Discuz!开发之模板支持引用php文件的方法
- php 多线程测试程序
- opencv3.2 编译安装