react小记

折腾。

这2天弄了一下react,觉得比较绕,记录一下。

1、控件嵌套
自定义控件内部再嵌套其他控件。主要是外层这个控件,代码里要处理一下,将嵌套在自己里面的控件或内容展示出来。
比如:


const b1 = {
  height: '400px',
}
const sb1 = JSON.stringify(b1)
。。。
<Block title="备案申请" style={sb1}>
     <Button type="primary">
       太空飞船租赁业务备案
     </Button>
</Block>

其中,<Block>是自定义控件。它是一个方框。按这里的意图,是要在里面放一个按钮。

在这里插入图片描述

Block的完整代码:

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import ReactDOM from 'react-dom'
import { title } from '@/defaultSettings'

const b = {
  margin: '5px',
  border: 'solid 1px #007ACC',
}
const bTitle = {
  backgroundColor: '#007ACC', //驼峰法
  minHeight: '25px',
  color: '#fff',
  fontSize: '14px',
}

class Block extends Component {
  constructor(props) {
    super(props)
    this.state = {}
  }

  static propTypes = {
    children: PropTypes.node,
  }

  getStyle = (self) => {//设置样式
    if (!self.props.style) return b

    let b2 = JSON.parse(JSON.stringify(b))
    let styles = JSON.parse(self.props.style)
    for (let key in styles) {
      let s = styles[key]
      b2[key] = s
    }
    return b2
  }

  render() {
    return (
      <>
        <div style={this.getStyle(this)}>
          <div>
	        <!-- 对应页面中的 title="备案申请" style={sb1} -->
            <div style={bTitle}>{this.props.title}</div>
          </div>
          <div>
	        <!-- 输出嵌套内容 -->
            <ul>{this.props.children}</ul>
          </div>
        </div>
      </>
    )
  }
}

export default Block

2、控件设置
假设我要改变一个文本框里的值,该怎么办呢?

如果是VUE,很简单,绑定一个vue变量就可以了。而在react中,也是差不多的做法。

以下代码很简单,就是一个下拉框,一个文本框。当下拉框改变选项的时候,将值写入文本框。主要是文本框绑定了变量tenantValue,而tenantValue又指向了控件中的state.tenantValue。这样下拉框改变选项时将值赋给state.tenantValue即可改变文本框值。这一点可以说,react没有vue那么简洁,比较绕。为什么不能直接操作一个变量呢?非要通过state进行传递。比较绕是react这几天给我的感觉。

class Login extends Component {
  state = {
    tenantValue: '10001',
  }

  changeCategory = (value) => {
    this.setState({ tenantValue: value })
  }

  render() {
    const { tenantValue } = this.state 

    return (
      <div>
            <Select
              defaultValue="10001"
              onChange={this.changeCategory}
            >
              <Option value="10001">太空飞船经营人</Option>
              <Option value="10002">太空管理机构</Option>
            </Select>
            <Tenant
              name="tenantCode"
              defaultValue={tenantValue}
            />
      </div>
    ) //end of return
  } //end of render
}

export default Login

react组件有2个对象:state和props。props 是传递给组件的(类似于函数的形参),而 state 是在组件内被组件自己管理的(类似于在一个函数内声明的变量)。state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变。这就是为什么有些容器组件需要定义 state 来更新和修改数据。 而子组件只能通过 props 来传递数据。

3、一些古怪的语法
比如:

    //相当于 const type = this.state.type
    const { type } = this.state

再比如:

import { connect } from 'dva'

@connect(({ login, loading }) => ({
  login,
  submitting: loading.effects['login/login'],
}))
class Login extends Component {
}

@connect的作用是建立Login类的State和Props的映射关系。connect接收一个函数,返回一个函数。
@是一个语法糖。在这里,@connect相当于,传入Login,返回建立了State和Props映射关系的新Login
如果没有这个修饰符,是这样写的:

  export default connect({Login} => {
    ……
  })(Login)

注解会自动在 Login 组件外面包裹一层 Connect 组件,这个组件把 redux 状态树中我们需要的值传入 Login 组件的 props 中。

又比如

({ login, loading }) => ({
  login,
  submitting: loading.effects['login/login'],
})

// 等于以下代码
function (state) {
  var login = state.login;
  var loading = state.loading;
  return {
    login: login,
    submitting: loading.effects['login/login'],
  };
} 

4、小结
为什么一个前端,会搞得如此复杂。这其中,一部分是react自己的原因;也有一部分是es6、es7的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值