React 内 JSX了解及使用

news/2024/7/15 17:33:09 标签: react.js, javascript, 前端

Jsx的全称是Javascript XML,react定义的一种类似XML的JS拓展语法:JS+XML,使我们可以用类似于xml方式描述视图。

本质是React.createElement(component, props, ...children) 的语法糖

原理:babel-loader会预编译JSx为React.createElement(type,props,...children)

虚拟DOM是React.createElement产生的

优点:执行快,类型安全,简单快速     执行需要使用预编译器

作用:用来简化创建虚拟DOM

  • 写法: var ele = <h1>Hello Jsx!</h1>
  • 注意1:它不是字符串,也不是HTML/XML标签,不要写引号
  • 注意2:它最终产生的是一个JS对象,需要使用 {}运行js表达式
  • 注意3:样式类名指定不要用class,要用className(因为class是ES6内定义的关键字,所以这里需要使用className进行区分)
  • 注意4:内联样式,要用style={{key:value}} 的形式去写。
  • 注意5:只能有一个根标签。
  • 注意6:标签必须闭合。
  • 注意7:标签首字母
    • 若字母小写开头,则将标签转为html内同名元素,若html中无该标签对应的同名元素,则报错。
    • 若字母大写开头,react就去渲染相应的组件,若组件没有定义,则报错。

标签名任意:HTML标签或者其他标签。

jsx基本概念及例子

JSX是一种js的语法拓展,表面上是HTML,本质上是通过babel转换为js执行,在所有JSX里,我们是可以在 {} 中使用js的语法。

JSX本质是转换为React.createElement在React内部构件虚拟DOM,最终渲染处页面。

举个例子:这个是jsx的写法

class App extends React.Component{
  render(){
    return {
      <div>
        Hello {this.props.name}, I am {3+4} years old.
      </div>
    }
  }
}

ReactDOM.render(
  <App name="React"/>,
  mountNode
)

转换成js的写法:

class App extends React.Component{
  render(){
    return React.crehateElement(
      "div",
      null,   // 这里为div的属性
      "Hello",
      this.props.name,
      ", I am",
      3 + 4,
      " year old"
    )
  }
}

ReactDOM.render(
  React.createElement(App, {name: "React"}),
  mountNode
)

jsx的基本用法

主要的

标签内的注释是  {/* 注释内容*/}

这里展示jsx实现变量操作等,具体目录结构

App.css内:

.img{
    border: 1px solid #f00;
}

logo.js内随便找一张将图片即可。

App.js   (全部代码)

import React, { Component } from 'react'
import logo from "./logo.jpg";
import "./App.css";

//函数型组件传递props,在这里必须带属性,这用于父子组件数据传递
function Welcome1(props) {
  return (
    <div>
      Hello,{props.name}
    </div>
  )
}

export default class App extends Component {
  //1.当需要状态时,需要构造函数
  constructor(props){
    super(props);
    //2.初始化状态,现在为响应式数据
    // 每次状态更新都会导致render函数重新执行
    this.state = {
      count: 0,
      date: new Date()
    }
  }
  componentDidMount(){
    this.timer = setInterval(() =>{
      //3.更新状态
      this.setState({
          date:new Date(),     //最简单的更新状态的方式
          count:this.state.count + 1
      })
      //注意1.不能直接改状态
      //this.state.data = new Date();  //错误的
    },1000);
    //注意2.setState()是异步的,需要在后面加一个参数进行异步调用
    //这个写法是函数写法   setState
    this.setState((prevState,prevProps)=>{
      return {
          count :prevState.count + 1
      }
    },() => {
        console.log(this.state.count);
    })
  }
  componentWillUnmount(){
    clearInterval(this.timer);
  }
  formatName(user){
    return user.firstName+' '+user.lastName;
  }
  render() {
    const name = "123";
    //jsx本身也是变量
    const jsx = <p>hello,everyone</p>
    return (
      <div>
        App组件
        {/* 表达式 */}
        <h1>{name}</h1>
        <p>{this.formatName({firstName:'tom',lastName:'jerry'})}</p>
        {/* 属性 */}
        <img src={logo} style={{width:'100px'}} className="img" alt="11"/>
        {/* jsx本身也是表达式 */}
        {jsx}
        {/* 组件属性传值(父传子) :传入的属性是只读的,单向数据流 */}
        <Welcome1 name="tom"></Welcome1>
        {/* 使用状态 */}
        <p>{this.state.date.toLocaleTimeString()}</p>
      </div>
    )
  }
}


在js内class是关键字,在react内均使用className作为额它的类名,没有class。

这个里面包含了jsx的几种简单用法。

只是简单例子运行完成后基本展示如下:

标签内行内样式

注:标签内行内样式的写法:

<img src={logo} style={{width:'100px',fontSize:'30px'}} className="img" alt="11"/>

这里是两层 {{}},可能学过vue的人知道,这个  使用“Mustache”语法 (双大括号) 的文本插值,用于展示数据。

但是这里不一样,最外层的大括号代表需要在内部写js的表达式,里面大括号表示你需要写关于样式的对象。

具体的值内需要加上 '引号'      style={{width:'100px',fontSize:'30px'}}

自定义组件

在jsx内的实现:

function Welcome1(props) {
  return (
    <div>
      Hello,{props.name}
    </div>
  )
}


<Welcome1 name="tom"></Welcome1>

这里呢,引入自定义标签,都必须是首字母大写(这里的代码是App.js内的例子代码)。

JSX内只能有js表达式(返回的值有结果),不能有js语句(if,for等)


http://www.niftyadmin.cn/n/328654.html

相关文章

【云原生】私有镜像的解决方案-Harbor管理实战

前言 通过前面的镜像管理&#xff0c;我们知道docker的开发和运行都离不开镜像管理&#xff0c;如果要进行镜像管理就需要使用镜像仓库。 docker官方提供的镜像仓库是&#xff1a; docker hub&#xff0c; 很方面但从安全和效率的角度考虑&#xff0c;这样的公有镜像环境就无…

Mathtype修改硕士论文公式格式

Mathtype修改硕士论文格式 1将word格式的公式变为mathtype格式1选中公式2点击mathtype中的转换公式 2修改mathtype格式的公式文字版式 1将word格式的公式变为mathtype格式 1选中公式 如果不选公式默认全文所有公式或者指定的公式。 2点击mathtype中的转换公式 选择要转换的…

什么是指令重排?

什么是指令重排&#xff1f; 举例解释 Person person new Person(); 这段代码其实是分为三步执行&#xff1a; 为 person 分配内存空间初始化 person将 person 指向分配的内存地址 我们理解的执行顺序应该为&#xff1a; 1(分配空间) → 2(初始化) → 3(指向分配的地址) 由…

linux之多线程

1.基础知识 查看线程&#xff1a;ps -xH|grep 进程名 &#xff1b; 查看进程&#xff1a;ps -ef |grep 进程名 不能在子线程中使用exit&#xff0c;否则整个进程会退出&#xff0c;&#xff0c;一般使用pthread_exit(0)&#xff1b; 2. 线程参数的传递 //这种方式的强制转换…

ChatGPT的工作原理(纯干货,万字长文)

ChatGPT 能够自动生成一些读起来表面上甚至像人写的文字的东西&#xff0c;这非常了不起&#xff0c;而且出乎意料。但它是如何做到的&#xff1f;为什么它能发挥作用&#xff1f;我在这里的目的是大致介绍一下 ChatGPT 内部的情况&#xff0c;然后探讨一下为什么它能很好地生成…

easytrader交易接口推介:如何使用股票行情数据接口打板策略快人一步?

easytrader主要原理是利用python函数pywinauto自动获取同花顺上相应控件的值&#xff0c;进行模拟自动化的操作&#xff0c;不得不说python函数库的强大&#xff0c;其它语言非常也能做到。 你想靠自己运用非常少的编程技术为自己打造一套独一无二的量化交易系统吗&#xff1f…

win10,win11 下部署Vicuna-7B,Vicuna-13B模型,gpu cpu运行

运行Vicuna-7B需要RAM>30GB或者14GB的显存 运行Vicuna-13B需要RAM>60GB或者28GB的显存 如果没有上面的硬件配置请绕行了&#xff0c;我笔记本有64G内存&#xff0c;两个都跑跑看&#xff0c;使用python3.9&#xff0c;当时转换13b时一直崩溃后来发现是没有设定虚拟内存&…

通过2种Python库,教会你如何在自动化测试时加入进度条?

前言 我们在执行自动化测试或者调试时&#xff0c;自动化测试用例数量过多&#xff0c;不清楚目前用例数执行了多少个了&#xff0c;还差多少个执行完成。 这时候就会猜想&#xff0c;如果执行过程中存在进度条&#xff0c;就很清楚的了解到测试用例的执行情况&#xff0c;今…