React框架入门-创建项目、JSX了解

偏执的太偏执、 2022-11-03 00:45 323阅读 0赞

安装react官方脚手架(这里如果没有安装的话需要安装,安装一次即可)

  1. npm install -g create-react-app

创建项目

初始化项目

  1. create-react-app my-project

进入项目

  1. cd my-project

运行项目

  1. npm start

运行项目后打开文件:,可以看到public内存放的是静态文件,src内存放的是代码,index.js是项目的入口文件。

20210226003628179.png

运行项目打开后的结果为下图时,表示运行正常。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExODc5MjYyNzE2OA_size_16_color_FFFFFF_t_70

这里的整个简单的react就创建好了,可以进行开发。可以发现这个项目内没有发现配置文件,因为项目内都隐藏起来了,如果想打开配置文件,可以运行npm run eject ,但是这个操作是不可逆的,运行之后不会再恢复到之前的状态。不建议运行。

先删除掉除index.js以外的文件。

这里先写一个简单的例子:

index.js

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. ReactDOM.render(<h1>Hello,React!</h1>,document.querySelector('#root'));

root是react默认的挂载点,如下图:

20210227180117777.png

项目打包

项目打包,先进入项目目录后

运行

  1. // 1 打包命令
  2. npm run build
  3. // 2 安装serve的命令,但是如果你安装了就不需要再重复安装
  4. // 但是如果你不知道是否安装成功,可以在命令行内打出serve然后运行
  5. // 如果没报错就说明你已安装,如果报错提示未安装,就需要运行第2步
  6. npm install -g serve
  7. // 3 将打包好的项目运行起来
  8. serve -s build

这里放一张报错的截图:

20210315174845783.png

这个是安装报错的情况,没安装serve。

JSX

Jsx的全称是Javascript XML,react定义的一种类似XML的JS拓展语法:JS+XML。

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

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

  • 写法: var ele =

    Hello Jsx!

  • 注意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的写法

  1. class App extends React.Component{
  2. render(){
  3. return {
  4. <div>
  5. Hello {this.props.name}, I am {3+4} years old.
  6. </div>
  7. }
  8. }
  9. }
  10. ReactDOM.render(
  11. <App name="React"/>,
  12. mountNode
  13. )

转换成js的写法:

  1. class App extends React.Component{
  2. render(){
  3. return React.crehateElement(
  4. "div",
  5. null, // 这里为div的属性
  6. "Hello",
  7. this.props.name,
  8. ", I am",
  9. 3 + 4,
  10. " year old"
  11. )
  12. }
  13. }
  14. ReactDOM.render(
  15. React.createElement(App, {name: "React"}),
  16. mountNode
  17. )

jsx的基本用法

主要的

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

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

20210228012738651.png

App.css内:

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

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

App.js (全部代码)

  1. import React, { Component } from 'react'
  2. import logo from "./logo.jpg";
  3. import "./App.css";
  4. //函数型组件传递props,在这里必须带属性,这用于父子组件数据传递
  5. function Welcome1(props) {
  6. return (
  7. <div>
  8. Hello,{props.name}
  9. </div>
  10. )
  11. }
  12. export default class App extends Component {
  13. //1.当需要状态时,需要构造函数
  14. constructor(props){
  15. super(props);
  16. //2.初始化状态,现在为响应式数据
  17. // 每次状态更新都会导致render函数重新执行
  18. this.state = {
  19. count: 0,
  20. date: new Date()
  21. }
  22. }
  23. componentDidMount(){
  24. this.timer = setInterval(() =>{
  25. //3.更新状态
  26. this.setState({
  27. date:new Date(), //最简单的更新状态的方式
  28. count:this.state.count + 1
  29. })
  30. //注意1.不能直接改状态
  31. //this.state.data = new Date(); //错误的
  32. },1000);
  33. //注意2.setState()是异步的,需要在后面加一个参数进行异步调用
  34. //这个写法是函数写法 setState
  35. this.setState((prevState,prevProps)=>{
  36. return {
  37. count :prevState.count + 1
  38. }
  39. },() => {
  40. console.log(this.state.count);
  41. })
  42. }
  43. componentWillUnmount(){
  44. clearInterval(this.timer);
  45. }
  46. formatName(user){
  47. return user.firstName+' '+user.lastName;
  48. }
  49. render() {
  50. const name = "123";
  51. //jsx本身也是变量
  52. const jsx = <p>hello,everyone</p>
  53. return (
  54. <div>
  55. App组件
  56. {/* 表达式 */}
  57. <h1>{name}</h1>
  58. <p>{this.formatName({firstName:'tom',lastName:'jerry'})}</p>
  59. {/* 属性 */}
  60. <img src={logo} style={
  61. {width:'100px'}} className="img" alt="11"/>
  62. {/* jsx本身也是表达式 */}
  63. {jsx}
  64. {/* 组件属性传值(父传子) :传入的属性是只读的,单向数据流 */}
  65. <Welcome1 name="tom"></Welcome1>
  66. {/* 使用状态 */}
  67. <p>{this.state.date.toLocaleTimeString()}</p>
  68. </div>
  69. )
  70. }
  71. }

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

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

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

20210228013811513.png

标签内行内样式

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

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

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

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

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

自定义组件

在jsx内的实现:

  1. function Welcome1(props) {
  2. return (
  3. <div>
  4. Hello,{props.name}
  5. </div>
  6. )
  7. }
  8. <Welcome1 name="tom"></Welcome1>

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

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExODc5MjYyNzE2OA_size_16_color_FFFFFF_t_70 1

状态State

在组件内的值不断变化时需要使用到状态

setState用于修改状态这里可以传递你需要更新的对象或者是一个回调函数。

  1. setState({})
  2. setState(prev=>({}))

这两种方式,如果你更新的值是基于上一个状态的基础上(值相互依赖),就要使用第二种方法了。

如下,第一个方法的例子:

  1. this.setState({
  2. text:"111"
  3. })

第二个方法的例子:

  1. this.setState(prevState =>({
  2. goods:[...prevState.goods,{id:3,text: prevState.text,price:666}]
  3. }))

这里呢,因为setState是异步操作,所以在值改变后不会立即更新。

发表评论

表情:
评论列表 (有 0 条评论,323人围观)

还没有评论,来说两句吧...

相关阅读

    相关 React(二)—— JSX

    前言 现在我们知道了 React 是什么,让我们来看看本系列其余部分将会出现的一些术语和概念。 在上一篇文章中,我们研究了 React 是什么,并在高层讨论它是...

    相关 ReactJSX入门

    React是由ReactJS与React Native组成,其中ReactJS是Facebook开源的一个前端框架,React Native 是ReactJS思想在nati

    相关 React实战-深入了解JSX

    深入了解JSX 一:Why is JSX 各种编程语言层出不穷,每天都有新的编程语言出现,每隔一段时间,流行的编程语言将会如皇朝般更替。对于程序员来说,这是件又爱又恨的事情

    相关 React学习 -- JSX

    React为了方便组件化,需要构建HTML结构化页面。那么React是如何操作的呢?答案是,React通过创建与更新虚拟元素来管理整个虚拟DOM。 虚拟DOM是什么:由于DO

    相关 ReactJSX

    React JSX React 使用 JSX 来替代常规的 JavaScript。 JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。 我们不需