React 学习笔记(一)

1、一个最简单的react组件的结构


第一步:导入包

import React from 'react'  //react -->创建组件、虚拟dom元素、生命周期
import ReactDOM from 'react-dom'  //react-dom --> 把创建好的组件和虚拟dom放到页面上展示

第二步:创建虚拟DOM元素

参数一:创建元素的类型,字符串,表示元素的名称
参数二:是一个对象或者 null,表示当前dom的属性
参数三:子节点(包括 其他 虚拟DOM 获取 文本子节点)
参数N : 其他子节点

const myh1 = React.createElement('h1',{id:'myh1',title:'this is my h1'},'jiangtong')

const mydiv = React.createElement('div',null,'这是一个div元素',myh1)

渲染页面上dom元素的最好方式就是写html代码即 jsx 语法:

const mytest = <div>我的div</div> //会被Babel转义为 React.createElement()调用

第三步:使用ReactDom 把虚拟dom渲染到页面上

参数一: 要渲染的那个dom元素
参数二: 指定放到页面的哪个容器上,需要是一个dom元素,而不是选择器

ReactDOM.render(mydiv,document.getElementById('app'))

2、jsx语法


JSX,是一个 JavaScript 的语法扩展。我们建议在 React 中配合使用 JSX,JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。

JSX 中可以嵌入表达式:
const name ='jiangtong'
const myh1 = <h1>my name is,{name}</h1>
ReactDOM.render(myh1,document.getElementById('app'))
JSX 也是一个表达式:
function getGreeting(user) {
  if (user) {
    return <h1>Hello, {formatName(user)}!</h1>;
  }
  return <h1>Hello, Stranger.</h1>;
}

其它 :
在jsx控制区域内,需要写js代码,则把他放入{}
在jsx里面写注释 { /* ... */ }
为jsx中的元素添加class类名: 需要用className 来代替 class
在jsx 创建dom的时候,所有的节点,必须由唯一的根元素进行包裹

3、react 创建组件的两种方式


方法一:使用构造函数的方式创建组件

function Hello(props) { 
    // return null  表明此组件什么都不渲染
    return <h1>这是h1 renturn 的组件---{props.name}-{props.age}-{props.gender}</h1>
  }
const dog ={
    name:'大黄',
    age:'3',
    gender:'男'
}
ReactDOM.render(<div>
    这是我的 div 盒子
    <Hello {...dog}></Hello>
</div>,document.getElementById('app'))
小总结:
  • 因为是构造函数,首字母要大写
  • 在组件中必须返回一个jsx虚拟dom 元素
  • props里面的属性是只读的 !!,不可以被重新赋值
  • 组件抽离要使用 export default xxx 将其暴露

方法二:使用 class 创建组件

class Movie extends React.Component {
    constructor(){
        super()
        this.state = { // this.state 的数据是可读可写的
            msg:'大家好啊,我是可读可写的 !'
        } // 相当于 Vue里面的 data(){return{}}
    }

    render(){  //// render ----渲染当前组件对应的 虚拟dom元素
        // this.props.name = 'lisi' 不可,是ready only属性
        this.state.msg = 'msg的值被我修改了啊'
        return <div>
            <h1>这是Movie组件-{this.props.name}-{this.props.age}</h1>
            <h3>{this.state.msg}</h3>
        </div>
    }
}

const user ={
    name:'jt',
    age:22,
    gender:'女'
}
ReactDOM.render(<div>
    123  
    <Movie {...user}></Movie> 
</div>,document.getElementById('app'))
小总结:
  • super() 其实是父类中 constructor 构造器的一个引用(固定写法)
  • 子类中独有的 this 只能写到super下面

两种方式的区别:
1、使用class 关键字创建的组件,有自己的私有数据和生命周期。使用 构造函数创建的组件,只有props,没有自己的私有数据和生命周期
2、用class 创建的组件叫有状态组件,用构造函数创建的组件-----叫无状态组件

有无状态组件的本质区别: 有无state 属性和有无生命周期函数

4、props 和 state


props:

function Hello(props){
    // Wrong------->props.name = 'zhangsan'
    return <div>hello world  +  {props.name}</div>
}
React.render(
    <Hello name="jiangt"/>,
    document.getElementById('app')
)
  • 构造函数创建的组件使用 props 传递参数

this.props:

class Hello extends React.Component{
    constructor(props){
        super(props)
    }
    render(){
        return <div>hello + {this.props.name} </div>
    }
}
  • 在class类创建的组件里面,如果我们要传递参数,要使用 this.props ,同时,必须在constructor以及super里面显式地传递入我们的props。

总结

  • props 是只读的 !!!
  • 数据是向下流的,父组件通过props把他的data 传给子组件。
  • props不需要我们定义,这个是react里面就存在的一个东西,专门用来存放我们的要传递的参数的
  • this.props和props其实是一样性质的,只是在不同的地方有不同的用法。

state:

class Hello extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      msg: 'hello world !',
    }
  }
   render() {
    return 
      <h1>{ this.state.msg }</h1>
   }
}
  • state 是可读可写的 !!!
  • state是私有的数据对象,只会存在class类创建的组件里面。
  • 不能直接修改 State,要使用 setState({ key : value })。
  • State 的更新可能是异步的,当需要依赖当前状态来改变下一个状态时,可以让 setState() 接收一个函数而不是一个对象。
  • 调用 setState() 的时候,React 会把你提供的对象合并到当前的 state。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 学习目的 熟练使用 React,并能运用 React 做一个项目,了解 React 开发。 学习技巧,用学...
    _1633_阅读 513评论 0 1
  • 零、初识React 在一个HTML文件中引入react和react-dom后,可以访问到这两个对象 一、creat...
    许小花花阅读 463评论 0 0
  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 2,804评论 0 24
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,421评论 1 33
  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,046评论 2 35