react和react jsx基础

2023-11-19

本文是个人学习笔记,例子都是来自React Native官网。之前不是做前端的,没有使用过react,要学习react native做混合开发,react,包括react jsx还是得补补。

react和react jsx

react是一个js库。有很多可以用的方法,react jsx是对javascript进行封装,提供一种类似于xml格式的语句,跟html也类似,使得在js中创建、修改元素,建立元素之间的层级关系变得更加直观方便。jsx在执行的时候会被转换为js语句。
例如:
<input type=“button"/>;
这样就相当于调用了
React.createElement()方法来创建一个button
在jsx中可以使用js语句,但是要用花括号括起来,比如:
var person = <Person name={window.isLoggedIn ? window.name : ''} />;
jsx中,元素可以直接嵌套,这个和html、xml都是一样的。
jsx中,布尔值用{true}和{false}表示。
jsx中,插入注释,就是用/* 注释 */

react和jsx混合起来,数据绑定的实现

假如有一个这样的数据(js定义的数据)

var data = [
  {id: 1, author: "Pete Hunt", text: "This is one comment"},
  {id: 2, author: "Jordan Walke", text: "This is *another* comment"}
];

希望建立一个列表,其中每一项,展示以上data中的一条数据:
于是定义一个CommentList的组件,其中每一项是一个Comment对象(假设之前已经定义好了Comment组件)。

var CommentList = React.createClass({//创建一个组件,或者理解成创建一个类也可以
  render: function() {//render函数是在组件声明周期中会被自动调用的方法之一,作用是返回组件的内容
    var commentNodes = this.props.data.map(function(comment) {
//这个comment参数对于data中的一条记录,map函数会为this.props.data的每一条记录调用一次这个function(comment)方法。每次调用都返回一个Comment组件对象,最终返回一个包含多个Comment的数组。
      return (
        <Comment author={comment.author} key={comment.id}>
          {comment.text}
        </Comment>
      );
    });
    return (
      <div className="commentList">
        {commentNodes}//包含CommentNodes,由于是js,所以用花括号括起来。
      </div>
    );
  }
});

使用这个定义好的CommentList,并且和数据绑定起来。

ReactDOM.render(
  <CommentBox data={data} />,
  document.getElementById('content')
);

属性 props 和 状态 state

上面例子中其实已经用到了react中一个比较重要的东西——属性。在jsx中,属性就类似于html的属性,包含在标签内,如这里的data
<CommentBox data={data} />
在组件的定义中,要访问自己的属性就通过this.prop.属性名,如这里的data。
this.props.data
在上面的用法中,可以看到,CommentBox的data属性是在使用CommentBox的时候,进行了设置,也就是CommentBox的父级对它进行了属性的设置。在CommentBox内部,只能通过this.props.data来使用这个属性,但不能改变这个属性。也就是说,属性是由组件的父级来设置的,对于组件来说,是不可变的。
但要在CommentBox中对自己的属性进行修改却是经常有的事,react对此为组件定义了一个状态的概念,state。组件的状态就是一组属性值。组件的属性不可直接修改,但可以修改组件的状态。可以为组件定义状态,也就是定义state,然后在需要时,进行状态的切换,这样,就实现了组件的属性从一个状态切换到另一种状态。
切换状态通过setState()方法,比如:

 this.setState({data: []});//更新状态,给data属性赋一个空数组。

访问当前状态的属性值,可以通过this.state.属性名,比如data,就是this.state.data
通过getInitialState方法,设置组件的初始状态。方法中

return{
属性一:值一,
属性二:值二,
…
}

利用state来保证组件的当前值,和属性的当前值始终一致。
下面建立一个commentForm组件,包含两个输入框,一个输入author一个输入text,演示如何利用state来实现,commentForm的author和text属性的值,始终和两个输入框中显示的值保持一致。

var CommentForm = React.createClass({
  getInitialState: function() {
    return {author: '', text: ‘’};    //设定初始化状态,给author和text属性都赋空值
  },
//定义了两个方法,在用户输入变化的时候会调用它们
  handleAuthorChange: function(e) {
    this.setState({author: e.target.value});
  },
  handleTextChange: function(e) {
    this.setState({text: e.target.value});
  },
//render方法
  render: function() {
    return (
//建立表单,让输入框的value始终等于属性author或text的值,在输入框value变化的时候更新author或text的值。
      <form className="commentForm">
        <input
          type="text"
          placeholder="Your name"
          value={this.state.author} //让输入框的value始终等于属性author的值
          onChange={this.handleAuthorChange} //在输入框value变化的时候更新author的值
        />
        <input
          type="text"
          placeholder="Say something..."/让输入框的value始终等于属性text的值
          value={this.state.text}//在输入框value变化的时候更新text的值
          onChange={this.handleTextChange}
        />
        <input type="submit" value="Post" />
      </form>
    );
  }
});

样式 style

基本上所有的核心组件都有style这个属性。要设置组件的外观只要给style赋值。通常会使用js。

 <View style={{backgroundColor: ‘powderblue’,width:50,height:30}} />

第一个花括号表示语句块,第二个花括号表示在jsx中内嵌js。
通常界面复杂,样式复杂的时候,最好把样式集中定义。
使用StyleSheet.create()方法创建一个样式表,里面可以定义多种样式,然后用点语法进行访问。如下定义了一个样式表styles,里面定义了两种样式,bigbluered。在使用的时候就可以通过styles.bigblue或者styles.red找到。

const styles = StyleSheet.create({
  bigblue: {
    color: 'blue',
    fontWeight: 'bold',
    fontSize: 30,
  },
  red: {
    color: 'red',
  },
});

使用的时候这样:

<Text style={styles.red}>just red</Text>
<Text style={styles.bigblue}>just bigblue</Text>
<Text style={[styles.bigblue, styles.red]}>i love you</Text>

注意,像第三句中使用了两种样式,那么排在后面的样式会覆盖前面的样式。

布局

大小:

组件的大小可以用flex来确定。这个东西是相对的。把屏幕大小作为1,那么先将父级的flex设置为1。然后子级的组件就可以通过设置flex的值来确定占据父级空间中的百分比。
比如总共有两个子级的组件,其中子级1的flex为1,子级2的flex为2,那么两个子级的flex加起来就是3,所以子级1就占据父级的三分之一,而子级2占据父级三分之二。没错,就是这么简单。
直观一些:(这里有3个子级咯,思想是一样的)

 <View style={{flex: 1}}>
        <View style={{flex: 1, backgroundColor: 'powderblue'}} />
        <View style={{flex: 2, backgroundColor: 'skyblue'}} />
        <View style={{flex: 3, backgroundColor: 'steelblue'}} />
      </View>

效果:
这里写图片描述
这个就是flexbox的基本思想。它可以用来适配不同屏幕大小。
位置:
使用flexbox中的三个属性联合来确定组件的位置:flexDirection、alignItems、justifyContent。
说白了flexbox就是流布局,或者有的叫瀑布流也可以。

  • flexDirection就是流的方向,是row的话,组件从左到右排列(横向),column的话,组件从上到下排列(纵向)。默认是row,从左到右。
  • justifyContent就是组件沿着纵flexDirection排列时的分布方式或者对齐方式。可以是居中,集中在开头,集中在尾部,或者分散分布等等。可以自己把这些候选值都试个遍:flex-start, center, flex-end, space-around, and space-between。
    比如这样:
<View style={{
        flex: 1,
        flexDirection: 'column',
        justifyContent: 'flex-end',
      }}>                                   
        <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} />
      </View>

效果:
这里写图片描述

  • alignItems也是对齐方式,或者分布方式,不过和justifyContent不同的是,justifyContent是规定该组件在flexDirection方向上的对齐方式,alignItems恰恰是规定该组件在另一个方向上的对齐方式。也就是说,如果组件是纵向排列的,那么这个alignItems规定组件在横向上的排列方式。候选值:flex-start,center,flex-end,stretch。

注意到,上面说的三个属性,都是给父级组件管理其子级组件时使用。

以上纯属个人初学简单理解,可以作为参考。需要更权威的知识总结在官网可以找到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react和react jsx基础 的相关文章

  • 使用 ts-node 时,Typescript 的声明合并无法按预期工作

    对于使用的项目express session包 我正在尝试改变session只需添加用户密钥即可实现对象 req session user 123 来自 哪里这个问题的 https stackoverflow com q 65108033
  • 将 showModalDialog() 的内容添加到剪贴板 Google 脚本

    当我单击按钮时 我已将格式化数据添加到模态对话框中 我想要的内容showModalDialog 当我单击按钮时也会自动添加到剪贴板 模态是用下面的代码生成的 并且temp是我想要添加到剪贴板的输出 Output to Html var ht
  • Javascript 图像 src 属性返回错误值

    我有一些 javascript 代码附加到一个带有 onclick 的按钮 代码如下 function ondelete var getDiv document getElementById imgdiv var lb img imgdiv
  • 为什么`.forEach`适用于密集数组但不适用于稀疏数组? [复制]

    这个问题在这里已经有答案了 我试图理解 空 稀疏数组之间的区别 例如new Array 3 和一个等效的 空 密集数组 具有 3 个未定义条目的数组 我可以通过以下两种方式创建一个包含 3 个未定义值的数组 var sparse new A
  • 角度`@Host`装饰器没有到达顶部?

    在我的主要app ts我已宣布成为全球提供商 providers provide Dependency useValue createDependency AppModule provider Where createDependency只
  • 超出最大调用堆栈大小 - Vue.js

    我有一个计算方法 可以让我计算产品的总价和折扣值 并希望获得以下值 总计 折扣 cartTotal var total 0 var discount Math round 0 1 this cartTotal 100 100 this ca
  • 在 JavaScript 中使用科学计数法的陷阱

    这个问题是not寻求开发人员代码格式化意见 就我个人而言 我更喜欢在 JS 代码中使用科学计数法 因为我相信它更具可读性 为我 6e8比600000000 话虽这么说 我只是在寻找在 JS 中以科学记数法指定数字的潜在风险和缺点 我在野外并
  • 为什么 Chart.js 画布不考虑容器元素的填充?

    我将 Chart js 与简单的折线图一起使用 但 Chart js 计算的宽度和高度属性似乎基于父元素的总宽度和高度 忽略填充 var options maintainAspectRatio false responsive true v
  • Fabric JS ClipPath:裁剪后如何使图像适合画布?

    我使用 FabricJS 和 ClipPath 属性实现了图像裁剪 问题是如何使裁剪后的图像适合画布 我希望裁剪后的图像填充画布区域 但不知道是否可以使用 Fabric js 来完成 因此 我希望用户单击 裁剪 按钮后图像的选定部分适合画布
  • Javascript查找伪元素

    所以我一直在努力CSS 选择器引擎 https github com alpha123 Puma 并且我想支持伪元素 before after selection first line 等 我注意到 Slick Sizzle 和其他一些流行
  • 函数默认参数有些问题?

    看到这个 let foo outer function bar func x gt foo let foo inner console log func bar outer 我想知道为什么输出是 外部 而不是 内部 我知道 JavaScri
  • AJAX 以渐进方式读取数据,而不仅仅是在完成时读取数据

    我喜欢为我的 ajax 调用创建一个进度条 为此 我可以使我的服务器端脚本返回其进度状态 所以我需要 JavaScript 来读取这个进度级别并显示它 有可能吗还是我走错了路 你可以尝试这样的事情 一些伪代码 假设是 jQuery 因为你已
  • 如何使用 toLocaleTimeString 12 小时时间而不使用 AM/PM 缩写?

    我想以 12 小时格式显示时间而不使用AM and PM 例如3 45仅且不3 45 PM or 3 45 AM 我该如何修改toLocaleTimeString 不显示PM AM但12位数字格式 var minsToAdd 45 var
  • 如何从对象文字数组中切片数组?

    我有这个数组 其中每个索引都包含一个对象文字 所有对象字面量都具有相同的属性 某些对象文字对于给定属性具有相同的值 我想创建一个包含only那些对象文字 我的想法是对数组进行排序 并将其切片成一个新数组 这是数组 var arr arr 0
  • 带有 Form 和 $setPristine 的 Angular 1.5 组件

    我正在尝试在 Angular 1 5 的组件中使用表单 我的表单可以正常工作 因为我有模型绑定并且可以在提交时获取数据 所以我已经完成了 90 的目标 缺少的是能够使用 setPristine 正确重置表单 我尝试了几种方法 第一种方法是将
  • 从扩展 pug/jade 模板将变量传递到基本布局

    我想通过在扩展基本布局的模板中声明变量来在 body 标记上设置一个类 当我尝试时 body class变量是undefined在布局中 看起来布局是在扩展模板之前执行的 或者它们是在不同的范围内执行的 还有别的办法吗 mixin 在这里可
  • 如何更改 localStorage 项中的单个值?

    我正在尝试更改本地存储中的值 此项是复选框的状态 我希望 每次选中复选框时都将该复选框的值设置为 true 或 false 我尝试了很多方法 直到我意识到不使用 JSON 就无法更改值 要添加我使用的值 localStorage setIt
  • 通过边框拖放调整 div 大小,无需添加额外的标记

    我有一个绝对定位的侧面板 我需要通过拖动此边框来更改其宽度 我还需要更改边框悬停上的光标 是否可以在不添加另一个 div 进行拖动的情况下做到这一点 这是标记 right panel position absolute border lef
  • 每 x 秒对 SVG 元素进行动画处理

    介绍 我了解一些基本的动画技术SVG两者同时使用Javascript和 DOM
  • 致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足错误

    我运行时收到此错误ng 构建 prod 92 块资产优化 4136 0155D210 443646 ms 标记 扫描 703 5 770 3 gt 703 6 759 8 MB 2162 2 0 0 ms 自标记开始以来 0 0 ms 0

随机推荐

  • MSP430嵌入式接口编程(惯性测量单元温湿度双音多频磁力计LCD显示等)

    Energia IDE编程MSP430 GPIO 串口通讯 定时中断 添加库 嵌入式器件接口编程 加速度计 include
  • 全 民 进 入 互 联 网

    2015年 3C行业的变化有目共睹 互联网 的概念全面深入人心 贯穿于企业经营和百姓的日常生活中 通讯行业提速降费 诸多国产精品手机现身 电商行业更加规范 移动端超越PC端成为主流渠道 家电行业诞生多个新技术 智能家电格局正在改写 让我们一
  • C++实现FFT频谱分析

    Update 9 10 2022 鸽了太久 增补了一些新的表述和简单推导 以及FFT在算法竞赛中的应用部分 帖子里的代码已经分别在2021全国大学生电子设计竞赛 洛谷OJ和课程设计中实战过 可靠性有保障 Origin 10 23 2021
  • web前端技术笔记(九)JavaScript介绍、变量、操作元素属性

    JavaScript JavaScript介绍 变量 变量类型 变量 函数 属性 函数参数命名规范 获取元素方法一 操作元素属性 通过 操作属性 通过 操作属性 innerHTML JavaScript介绍 JavaScript是运行在浏览
  • Ant-Maven-Gradle

    make Makefile学习 peterYong 博客园 ant ant 工具 milkty 博客园 maven 学习Maven这一篇就够了 轻松的小希的博客 CSDN博客 学Maven 这篇万余字的教程 真的够用了 江南一点雨 博客园
  • CSS 样式书写规范,css样式书写规范

    在工作当中css样式是非常重要的 但是咋样书写css样式更重要 一 css书写规范 1 定位属性 position display float left top right bottom overflow clear z index 2 自
  • 千与千寻 中日歌词与罗马音译(最准确啦)

    千与千寻 国语和日语版 Cover 木村 弓 作曲 木村 弓 作词 觉 和歌子 张 就此告别吧水上的列车就快到站 粥 呼 胸 奥 yo n de i ru mu ne no do ko ka o ku de 张 开往未来的路上没有人会再回返
  • MySQL 触发器入门 (转载)

    博客迁移 时空蚂蚁http cui zhbor com MySQL 5 1包含对触发器的支持 触发器是一种与表操作有关的数据库对象 当触发器所在表上出现指定事件时 将调用该对象 即表的操作事件触发表上的触发器的执行 创建触发器 在MySQL
  • Android 本地更新APK(无需添加运行时权限)

    很多APP都会有自动更新APP然后本地安装的功能 之前一直是用AsnycTask来做的 最近发现AsyncTask被标记为过时 那么就换一种方式来写吧 我自己是做在Dialog里面 使用okhttp进行文件下载 配合自定义View的进度条进
  • python大规模数据处理技巧之一:数据常用操作

    面对读取上G的数据 python不能像做简单代码验证那样随意 必须考虑到相应的代码的实现形式将对效率的影响 如下所示 对pandas对象的行计数实现方式不同 运行的效率差别非常大 虽然时间看起来都微不足道 但一旦运行次数达到百万级别时 其运
  • 线程的创建及性能

    目录 1 多线程 VS 单线程性能 2 线程3中创建方式 2 1 创建方式一 继承Thread 1种写法 2 2 创建方式二 实现Runnable及变种 4种写法 2 3 创建方式三 带返回值的Callable 2种写法 线程休眠演示打印电
  • momentJS 时间差计算

    momentJS时间差计算 最近在使用JavaScript计算时间差的时候 发现很多问题需要处理 在查看momentJS之后 发现非常容易 console log moment format YYYY MM DD HH mm ss 当前时间
  • 完全二叉树与满二叉树

    去笔试了很多次 每次都有有关于二叉树的题目 而且其中最多的是关于完全二叉树 然而完全二叉树在哥心中的形态一直很模糊 究其原因是我把完全二叉树和满二叉树搞混了 其实满二叉树是完全二叉树的特例 因为满二叉树已经满了 而完全并不代表满 所以形态你
  • 提升应用性能的关键步骤——UniApp性能优化策略与技巧详解

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 文章目录 前言 代
  • JAVA,异常

    异常概念 通常大家认为异常就是错误 但这个错误有很多种 1 语法错误 2 JVM虚拟机错误 3 平台错误 4 程序运行错误 平台或者资源或者逻辑 数值等错误 常见的异常 1 java lang NullPointerException 空指
  • C++ 模板简介(一)—— SFINAE

    SFINAE 类型检查 Concepts SFINAE 机制是组成 C 模板机制及类型安全的相当重要的基础 全称是 Substitution failure is not an error 大概的意思就是只要找到了可用的原型 比如函数模板
  • Video Device Class Codes

    ifndef LINUX USB VIDEO H define LINUX USB VIDEO H include
  • 解决导入keras.engine 问题

    导入 keras engine 可能会产生No module named tensorflow keras engine 我们采用下列方式导入时 from tensorflow keras engine topology import La
  • 2019-面向小白的微信小程序-视频教学-基础

    看掘金链接 https juejin im post 5dd739a1e51d4523053c4282
  • react和react jsx基础

    本文是个人学习笔记 例子都是来自React Native官网 之前不是做前端的 没有使用过react 要学习react native做混合开发 react 包括react jsx还是得补补 react和react jsx react是一个j