前端入门之旅——react

299 阅读4分钟

一,引入

    <script src="./react.development.js"></script>
    <script src="./react-dom.development.js"></script>
    <script src="./browser.min.js"></script>
    
    <script type="text/babel">
        内容
    </script>

二,JSX

JSX是一种Java Script 的语法扩展,React.DOM.render()将react元素渲染到Dom节点中;

// render方法有两个参数 第一个参数是要插入的内容,第二个参数是挂载的根元素
  // jsx里插入表达式需要用一个{}
  // jsx里的标签必须有结束标签
    let name = 'xiaoming'
    ReactDOM.render(
      <h1>
        hello world, {name + 'LALAL'}
        <input type="text"/> 
      </h1>,
      document.getElementById('app')
    )

三,组件

方法一:使用JavaScript函数(无状态组件)

const Welcome = () => {
      return <h1>hello xxx</h1>
    } 
    // props参数是一个obj接收父组件的传值,return的最外层标签是只能有一个父元素;
    const Com = (props) => {
      return (
        <div>
          <h1>{props.name}</h1>  
          <p>world</p>
          <span>{props.title}</span>
          {props.children}
        </div>
      )
    }
    ReactDOM.render(
      <Com name="hello" title="aaaaa">
        <input type="text"/>
      </Com>,
      document.getElementById('app')
    )

方法二:利用ES6 class 来定义一个组件(有状态组件)

    class Com extends React.Component{
      render() {
        return (
          <div>
            <h1>hello</h1>  
            <p>{this.props.name}</p> //利用this.props来接收父组件的传值
            <span>{this.props.title}</span>
            {this.props.children}
            <Wel/>
          </div>
        )
      }
    } 
    ReactDOM.render(
      <Com name="hello" title="aaaaa">
        <input type="text"/>
      </Com>,
      document.getElementById('app')
    )

三,有状态组件和无状态组件的区别和特点
1,函数式(无状态的)只能展示内容;
类可以展示和修改内容
2,组件名称的首字母必须大写;
3,props.children 取到组件中首尾标签中间的值{props.children} 或{this.props.children} 类似vue中的slot 4,函数式需要用props.xxx来接收父组件的传值;
类需要用this.props.xxx来接收父组件的传值;
5,组件和React.DOM中的标签必须是闭合的;

四,state

State是组件对象最重要的属性,值是对象(可以包含多个数据),用于改变组件 内通状态的值(动态的)

组件被称为“状态机”,通过更新组件的state来更新对应的页面显示(重新渲染 组件)
首先,属性值写在构造函数中
其次,组件中的数据写在state对象中
1,初始化状态

class Main extends React.Component{
    constructor(props){
        super(props);
        this.state={
            num:[]
        }
    }
}

2,读取某个状态值

this.state.num...

3,组件数据更新

this.setState({
    num:this.state.num++;
)

4,props和state的区别

  • props是不可变的,用于父子组件之间的传值;而state可以改变

五,refs

ref属性通常放在input标签内部交互获取输入框内的值类似于vue中的v-model

方法一:

定义:
<input type="text" ref="name"/>  
获取:
this.refs.name.value

方法二:

定义:  
<input type="text" ref={input =>myInput=input}/>   
获取:
this.myInput.value

input =>this.myInput=input==(input)=>{myInput=input}

推荐使用方法二

六,组件事件

1,组件事件的绑定使用驼峰式;
例:<button onClick={this.方法名}></button>

2,组件事件绑定时的this指向(自定义的事件都需要改变this的指向)

方法一:
<button onClick={this.方法名.bind(this)}></button>
方法二:
<button onClick={this.方法名}></button>
在组件的构造函数中
constructor(params){
    super(params);
    this.方法名=this.方法名.bind(this)
}

3,形参event可以取到这个事件
4,父组件向子组件传递事件

class Childern extends React.Component{
    constructor(params){
        super(params);
        this.click=this.click.bind(this)
    }
    click(){
        this.props.add();
    }
    render() {
        return (
          <div>
            <button onClick={this.click}></button>
          </div>
        )
      }
    } 
    
 class Main extends React.Component{
    constructor(params){
        super(params);
        this.add=this.add.bind(this)
    }
    add(){
        
    }
    render() {
        return (
          <div>
            <Childern add={this.add}></Childern>//子组件
          </div>
        )
      }
    } 

七,取出对象中属性的方法

let obj = {
      name: 'xm',
      age: 12
    }
    属性值为常量:
    1,obj.name;
    2,obj['name']
    属性值为变量:
    1,let tag='name'
       obj[tag]

八,双向数据绑定

类似于VUE中的v-model 利用onChange函数 每当DOM元素中的内容发生改变时就触发一次这个方法
change(event){
    console.log(event.target.value)//可以获取到表单元素中的数据
}
<input onChange={this.change}/>

九,组件样式

  • 设置内部或外部样式
在style标签内部书写样式,
在需要添加样式的dom元素上利用className或id来对应类/id选择器的名字
  • 设置内联样式
方法一:<h1 style={style}></h1>
        在render函数内部定义一个属性style  
        如:let style={
            color:red
        }  
方法二:<h1 style={
    {
        color:red
    }
    }></h1>

十,条件渲染

render()函数的return 中只能够返回简单的三目运算符 在render()函数里 return函数外部{ 利用if语句外部循环 利用map语句进行遍历 }

生命周期钩子函数


1,constructor()        设置状态state
2,conponentWillMount()         修改状态  
3,render()     渲染虚拟dom  
4,conponentDidMount()  渲染完毕
5,componentWillReceiveProps   子组件接收到父组件的数据
6,shouldComponentUpdate  本组件是不是需要进行去更新视图,默认为true,要不不写,写了必写返回值,false表示不更新视图
7,componentWillUpdate  组件即将被更新-----无实际意义
8,render  重新渲染数据
9,componentDidUpdate 实例化一些对象(特别是如果数据是动态请求的)
10,componentWillUnmount 清除一些计时器,定时器等
11,componentDidCatch 错误异常处理