ES6 react.js 开发实践笔记

react构建指南

1,使用react需要用到脚手架 create react -app
     使用之前需要装有node ,因为需要用到node的npm
     安装的时候需要全局安装一个包,然后找个地方安装myapp
     替换淘宝镜像 $ npm install cnpm -g --registry=https://registry.npm.taobao.org
     以后使用cnpm会更快一些。
2,需要react router 路由管理
    安装所必须要的包:
   npm install --save-dev react-router
   npm install --save-dev react-router-dom

1,props

1,props初始化的时候使用,state是交互的时候使用,仅用户交互,会随着事件改变
2,需要从父组件传递用props,随着时间推移不会改变用props
3,props不给初始值的话,会默认为true,但是不建议不给初始值
4,Text.defaultProps={//defaultProps可以给Text组件添加props
   name:"hello"
     }
5,传递props值,可以用<Greeting {...props}/>但是谨慎使用
组件类 :  
      <Mytab name="abcd" age="aaa"/>,//是一个React组件类大写 
component: 
    <span>{this.props.name},{this.props,age}</span>//在组件的时候获取的时候用

特点:1,属性不好改,定死的
    2,props一般用来传递数据,父组件向子组件传递数据。

2,state

1,constructor(props){super(props)}//组件应该始终调用基础构造函数,一般来说是初始化组件的时候执行的。
2,在constructor里面可以直接this.state={};给state赋值
3,在其他方法里面不允许这么写。需要this.setState({...})
4,this.props和this.state是队列更新dom,所以有可能会有没排队跟上的情况,不应该用他的上一次值来做操作。解决 的办法是用setState()来接受一个函数而不是上述对象,
this.setState((prevState, props)=>({
counter:prevState.counter+props.increment
}))

3,事件

1,react建议直接把监听事件写在dom中
2,on...事件监听只能作用于普通的html标签上,不能适用于组件上面
2,onClick={this.click}//绑定事件驼峰命名,写法如此
3,需要在construtor(){ this.click=this.click.bind(this)}//进行事件绑定
    然后lick(){this.setState({name:"000"})//才可以设置state的值}//不然设置不了state的值
4,如果嫌麻烦不愿bind,可以直接写成
    click=()=>this.setState({name:"000"})//绑定事件第二种方法,就不用bind绑定了,是ES6写法
    或者onClick={()=>this.click()};  然后click(){this.setState({name:"000"})}//这样也不用绑定bind了

4,组件

1,如果一个新组件 retrun null或者retrun false,则这个新组件讲不会显示,但是会执行生命周期方法。
2, {a&&<span>aa</span>},如果a有值或者是true,则显示aa组件,否则不显示
3,false,null,undefined,值为这些的条件都不渲染。
4,不受控组件的解决方案:
   <input type="checkbox">和<input type="radio">支持defaultChecked,//不能直接使用checked因为使用了就不可变了
   <select>与<textarea>和<input/>支持defaultValue。//不能直接使用value因为使用了就不可变了
5,forceUpdate就是手动重新render。有些变量不在state上,但是你又想达到这个变量
     更新的时候,刷新render;
     或者state里的某个变量层次太深,更新的时候没有自动触发render。
     这些时候都可以手动调用forceUpdate自动触发render。所以建议使用immutable来操
     作state,redux等flux架构来管理state。
6,如果shouldComponentUpdate返回false,则render()不会被调用,就不更新状态。

5,组件之间的通信

1,父组件可以通过props的方式向子组件传值
2,父组件可以通过{...this.props}的方式传入更深层子孙组件如:
// 通过 ... 运算符 向 Child_1_1 传递 Parent 组件的信息
class Child_1 extends Component{
  render() {
    return <div>
      <p>{this.props.msg}</p>
      <Child_1_1 {...this.props}/>
    </div>
  }
}
class Child_1_1 extends Component{
  render() {
    return <p>{this.props.msg}</p>
  }
}
3,子向父组件通信
  //可以利用回调函数
class Parent extends Component{  //父组件
  state = {//  es7语法
    msg: ''
  };
  val=(data)=>  this.setState(mag:data); //父组件的props中val方法
  render() {
    return <div>
        <p>child msg: {this.state.msg}</p>
        <Child  value = {this.val} />//父组件的props
      </div>;
  }
}

class Child extends Component{//子组件
 click(){
           this.props.valuel('可以可以是随便的值,也可是是此子组件的state')
       }
    render(){
        return <div><button onClick={this.click} >点击通信</button></div>
}
  }
3,兄弟之间的通信 就是借助父组件做为中间桥梁,进行通信的。
4,兄弟之间的这种通信模式会触发很多次生命周期,故需要一种观察者模式import eventProxy from '../eventProxy。还有更好的解决方式,redux,后续跟进。

5,列表和秘钥

1,可以使用map()来渲染li列表
function NumberList(props) {
  let number=props.numbers;
  let numlist=number.map((n)=> <Listi key={n.toString()} value={n}/>);//一定要加key区别与其他列表。
   return <ul>{numlist}</ul>                      
}

function Listi(props){
   return <li>{props.value+1}</li>   //key不应写在这里,应写在根元素,可以在这里做数据操作+1
  }

const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
  <NumberList numbers={numbers} />,
  document.getElementById('root')
);

6,froms表单

1,普通的表单提交如果用在react上,实现这一点的标准方法就是一种称为受控组件的技术
2,textarea,select,input  checkbox同样受用.

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({value: event.target.value});
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

7,propsTypes

1,PropTypes导出一系列验证器,可用于确保您接收的数据有效
2,PropsTypeys提供了不同的验证器
import PropTypes from 'prop-types';
class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    );
  }
}

Greeting.propTypes = {
  name: PropTypes.string
};

8,ref和js中的DOM操作

1,react封装了很多个.on事件,几乎不需要和dom直接打交道,react其实也建议过多的使用ref
1,ref就相当于一个DOM挂钩,在某个元素上设置ref,就可以取得这个DOM元素进行操作。

onclick(){   //点击获取ref设置的this.in的挂钩,进行DOM操作
   this.in.focus();
 } 

render(){
        return (
           <div>
         测试: <input ref={(input)=>{this.in=input;}} type="text" />//设置ref,this.in就是此input
        <button onClick={this.onclick}>点击获取input焦点</button>
        </div>
        )
    }
**4,注意{{}}**
 <span tyle={{display:none}}}> 我是span1</span>//style要放到{{}}里面

容器组件

1,只放容器的组件,注意有结束标签
 <BlackBorderContainer>
                <div className='name'>My Name:Lucy</div>
                <p className='age'>
                    My Age:<span>12</span>
                </p>
            </BlackBorderContainer>

class BlackBorderContainer extends  Component{
     render(){
         return (<div>
             {this.props.children[1]}<hr/>{this.props.children[0]}
         </div>)
     }
 }

组件的生命周期

-> constructor()          //初始化一些状态
-> componentWillMount()  //  加载ajax
-> render()
// 然后构造 DOM 元素插入页面
-> componentDidMount()
// ...
// 即将从页面中删除
-> componentWillUnmount()//清除一些状态机
// 从页面中删除




componentWillMount(),创建之前
componentDidMount(),创建之后
组件输出已经呈现给DOM后,
componentWillReceiveProps()//组件的参数更新时,就是组件接受一个新的任务
componentWillUpdate(),更新之前
componentDidMount(),更新之后
componentWillUnmount() 组件对应的 DOM 元素从页面中删除之前调用

5,组件里面可以有子组件


6,创建列表  Mocha 调试用的 react全家桶系列之一
里面的有一个key 值,用来识别dom的唯一性,react发现如何存在就不重新创建,如果无就新建

下午创建一个列表

7,组件内的节点
node 标签
怎么操作需要渲染的标签
ref 类似于id
ref=“f1”
  取 this.refs["f1]


8,在constructor中其实组件并没有完全准备好,因为组件还没有彻底渲染出来。所以使用refs的时候,一定要注意。
 
9,默认值,可以用default  Value Checked   这样是可以改的
10,事件冒泡:


Origin
1、React并不会通过String类型的Html片段生成DOM
2、在componentWillReceiveProps中调用setState()不会触发re-render
3、componentWillUpdate中不能调用this.setState()
4、在通过Ajax获取到数据,调用this.setState()之前,应该通过this.isMounted()确定当前的component已经处在渲染完成的阶段
5、父组件到子组件通过props传递数据,子组件向父组件传递数据通过global event方式来处理,即在root element上接受所有子组件的事件处理
6、移动设备的touch事件需手动开启:React.initializeTouchEvents(true)
7、setState(data, callback)中的callback是在re-render完成之后调用的
 

 











 










61,简答的输出
> ```class Mytab1 extends  React.Component{
    render(){
        return(<div>
            <span> 我是span1</span>
            <span> 我是span2</span>
            <span>我是span3</span></div>
        )
    }
}
class  Mytab extends  React.Component{
    render(){
        return  (<div><ul className="tab">
            <li>home</li>
            <li>about us1</li>
            <li>about us2</li>
            <li>about us3</li>
            <li>about us4</li>
        </ul>
        <Mytab1/>//组件类
        </div>);
    }
}
ReactDOM.render(
  <Mytab/>,//是一个React组件类 
  document.getElementById('example')
);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 最近看了一本关于学习方法论的书,强调了记笔记和坚持的重要性。这几天也刚好在学习React,所以我打算每天坚持一篇R...
    gaoer1938阅读 1,662评论 0 5
  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,037评论 2 35
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,808评论 1 18
  • GUIDS 第一章 为什么使用React? React 一个提供了用户接口的JavaScript库。 诞生于Fac...
    jplyue阅读 3,504评论 1 11
  • Learn from React 官方文档 一、Rendering Elements 1. Rendering a...
    恰皮阅读 2,658评论 2 3