前端之React学习(一)

前端之React学习(一)

react 基本概念

react 的基本概念

​ React 是 Facebook 开发的一款 JS 库 Facebook 认为 MVC 无法满足他们的扩展需求

特点

  1. react 不使用模板
  2. react 不是一个 MVC 框架
  3. 响应式
  4. react 是一个轻量级的 JS 库

原理

​ 虚拟 DOM react 把 DOM 抽象成为一个 JS 对象

​ diff 算法

  1. 虚拟DOM确保最对界面上真正发生变化的部分进行实际的DOM操作

  2. 逐层次的来进行节点的比较

react 开发环境的搭建

react 的使用

  1. react.js 核心文件
  2. react-dom.js 渲染界面中的 DOM 当前文件依赖于 react 核心文件
  3. babel.js ES6 转换成 ES5 JSX 语法转换成 JS 现今浏览器进行代码的兼容

下载

react 核心包 npm i react --save
react-dom npm i react-dom --save
babel npm i babel-standalone --save

jsx 基本使用

基本概念

jsx = javascript xml (javascript 的扩展语法)
优点: 1. 执行的效率更快 2. 他是类型安全的,编译过程中就能即使发现错误 3. 在使用 jax 的时候编写模板会更加简单和快速

注释

{/* */}

多行标签

需要用一个父元素包裹

jsx 进阶使用

使用表达式

把表达式放入{}

let text = "你好";
let num = 12334;
let myDom = (
  <div>
    <div>{text}</div>
    <div>{num}</div>
  </div>
)

计算

let num = 12334;
let myDom = (
  <div>
    <div>{num}</div>   {/* 12334 */}
    <div>{num+1}</div> {/* 12335 */}
  </div>
)

函数

let user = {
  name: "jack",
  age:17
}
function fun(obj){
  //return "姓名是"+obj.name+"---------"+"年龄是"+obj.age;
  //ES6
  return '姓名是${obj.name}---------$年龄是{obj.age}'
}
let myDom = <div>{fun(user)}</div>

三元/三目运算符

let phone= 4999;
let myDom=(
  <div>当前手机介个是{phone}---------{phone>4000?"很贵":"很便宜'}</div>
)

数组

var arr = [
  <p>新闻列表1</p>,
  <p>新闻列表2</p>,
  <p>新闻列表3</p>,
  <p>新闻列表4</p>,
  <p>新闻列表5</p>
]
let myDom=(<div>{arr}</div>)

属性设置(样式…)

let text = "点我去百度";
let linkUrl = "http://www.baidu.com";
let modstyle = { color: "red", backgroundColor: "pink" };
let myDom = (
  <div>
    <a href={linkUrl}>{text}</a>
    <p style={modstyle}>修改我的样式</p>
  </div>
);

** 注意: **

  • 在 jsx 中不能使用 class 这个属性,因为 class 是 JS 关键字
    class————>className

react 列表(遍历数据)

遍历数据的方法

map()循环遍历

 // map()
    let arr = ["吃饭", "睡觉", "打豆豆"];
    let arr1 = arr.map((item, index) => {
      return (<p key={index}>{item}</p>)
    })

    let myDom = (
      <div>
        map循环
        {arr1}
      </div>
    )

for in 循环遍历

//for in循环
    function fun() {
      let newarr = [];
      for (let index in arr) {
        newarr.push(<p key={index}>{arr[index]}</p>)
      }
      return (newarr);
    }
    let myDom = (
      <div>
        for in 循环
        {fun()}

      </div>
    )

for each

点击事件&render 重新渲染事件

let arr = ["吃饭", "睡觉", "打豆豆"];
    let i = 0;
    function fun() {
      let myDom = arr.map((item, index) => {
        return <p key={index} onClick={() => { i = index; console.log(index == i); render() }} style={{ color: i == index ? 'red' : '' }}>{item}</p>
      })
      return myDom
    }
    function render() {
      ReactDOM.render(fun(), document.getElementById("demoReact"));
    }
    render()

遍历对象

对象知识回顾:

  1. 取属性 obj.name 或者 obj[name]
  2. .的方法方便,但不能取变量,取变量用[]
  3. 对象的方法 Object.keys(obj)------- 返回数组类型,值是对象中的键(key)
  4. 对象的方法 Object.values(obj)----- 返回数组类型,值是对象中的值(values)

遍历对象

let obj = {
      name: "小明",
      age: 18,
      sex: "男"
    }
    let myDom = <div>{Object.keys(obj).map((v, i) => {
      return <p>遍历的属性是:{v}--------遍历的值是:{obj[v]}</p>
    })}</div>

面向组件

组件的重要概念

特点

高耦合低内聚

  • 高耦合:把逻辑紧密的内容放进一个组件内
  • 低内聚:不同的组件的依赖关系尽量弱化,每个组件尽量独立

重要组成

  1. 构建方式
  2. 组件的属性
  3. 生命周期

演变过程

  • 传统的组件的明显特点
    1. 简单的封装
    2. 简单的生猛周期的显现
    3. 明显的数据流动
  • 当一个项目比较复杂的时候,传统的组件根本不能很好地把结构样式和行为结合,让项目难以维护

react 组件的组成部分

  1. 属性 props
  2. 状态 state
  3. 生命周期

react 组件的作用

把页面中的 ui 部分切分成 独立、高复用性 的组件

组件与组件化

  • 组件:
    • 就是实现页面剧本功能的代码集合
    • 简化页面的复杂程度
    • 提高运行效率
  • 组件化:当前程序都是使用组件完成的

组件的创建

函数组件/无状态组件

  • 例子
    function Com1() {
      return (
        <div>我是一个无状态组件</div>
      )
    }
    let myDom = <div>
      <Com1 />
      <Com1></Com1>
    </div>
    ReactDOM.render(myDom, document.getElementById("demoReact"));
  • 父子组件
//父子组件
    function Com1() {
      return (
        <h1>我是第1个组件</h1>
      )
    }
    function Com2() {
      return (
        <h1>我是第2个组件</h1>
      )
    }
    function Com3() {
      return (
        <h1>我是第3个组件</h1>
      )
    }
    function Com4() {
      return (
        <h1>我是第4个组件</h1>
      )
    }
    // 父组件调用子组件
    function Com() {
      return (
        <div>
          <Com1 />
          <Com2 />
          <Com3 />
          <Com4 />
        </div>
      )

    }
    let myDom = <Com />
    ReactDOM.render(myDom, document.getElementById("demoReact"));

类组件

    // 创建类组件
    // 组件名首字母大写
    class Com extends React.Component {
      render() {
        return (
          <div>类组件</div>
        )
      }
    }
    let myDom = <Com />
    ReactDOM.render(myDom, document.getElementById("demoReact"));

props

定义

  • props 是 react 中的一个重要属性;
  • 是组件对外的接口
  • 用 props 就可以从组件外部向组件内部进行数据传递
  • 父组件给子组件的数据传递
    注意:
    无论是无状态组件还是类组件,都不能修改自身的 props

使用

无状态组件使用 props

    function Com(props) {
      return (
        // props.xxx(自定义)
        <div>我是一个无状态组件-------外部传递的数据是:{props.text}{props.name}{props.age}</div>
      )
    }
    let demo = "我是数据"
    //多个参数的传递
    let obj = {
      name: "hahah",
      age: 18
    }
    //{...obj}-----ES6
    let myDom = <Com text={demo} {...obj} />
    ReactDOM.render(myDom, document.getElementById("demoReact"));

类组件使用 props

    // 在类组件使用props
    class Com extends React.Component {
      render() {
        return (
          <div>我是类组件--------{this.props.name}------{this.props.num}</div>
        )
      }
    }
    let obj = {
      name: "我是name数据",
      num: "我是num树"
    }
    let myDom = <Com {...obj} />
    ReactDOM.render(myDom, document.getElementById("demoReact"));

验证与默认值

props 验证

  • 验证传递进去的数据是否符合我们期望的类型或者要求(针对开发时,控制台报错却无影响,上线时建议取消)
  1. 引用 prop-types 库
<!-- 下载 -->
 -----npm i prop-type --save
<!-- 引用 -->
  <script src="node_modules/prop-types/prop-types.js"></script>
  1. 使用
<!-- 组件名.propTypes={
  属性:PropTypes.数据类型
} -->

默认值用 defaultProps

无状态组件 props 的验证与默认值

  //引用
    <script src="node_modules/prop-types/prop-types.js"></script>
  //无状态组件props的验证与默认值
    //默认值用 defaultProps
    function Com(props) {
      return (
        <div>我是无状态组件--------------{props.name}--------{props.age}----{props.num}</div>
      )
    }
    //默认值
    Com.defaultProps = {
      num: "我是props中num的默认值"
    }
    //验证
    Com.propTypes = {
      name: PropTypes.number//验证name是否是数字类型
    }
    let obj = {
      name: "jjjj",
      age: 12

    }
    let myDom = <Com {...obj} />
    ReactDOM.render(myDom, document.getElementById("demoReact"));

类组件 props 的验证与默认值

//引用
<script src="node_modules/prop-types/prop-types.js"></script>
//在类组件中props的验证与默认值
class Com extends React.Component {
  //默认值第二种
  // static defaultProps = {
  //   sex: "我是默认值2"
  // }
  render() {
    return (
      <div> 我是类组件------------{this.props.name}---{this.props.age}---{this.props.num}---{this.props.sex}</div >
    )
  }
}
let obj = {
  name: "hahbjl",
  age: 16
}
//默认值第一种
Com.defaultProps = {
  num: "我是默认值1"
}
//验证
Com.propTypes = {
  name: PropTypes.number
}
let myDom = <Com {...obj} />
ReactDOM.render(myDom, document.getElementById("demoReact"));

更多文章链接

前端之React学习(二)
前端之React学习(三)
前端之React学习(四)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值