React基础学习(第三天)

条件渲染

1. if / else

  render () {if (this.state.isLoading) { // 正在加载中return <h1>Loading...</h1>}return <div>这就是我们想要的内容</div>}
// 钩子函数 五秒钟之后 修改状态值componentDidMount () { setTimeout(() => {this.setState({isLoading : false})}, 3000);}

2. 三元表达式

 return this.state.isLoading ? (<h1>Loading...</h1>) : (<div>这就是我们想要的内容</div>)

3. 逻辑运算符

 return this.state.isLoading && (<h1>Loading...</h1>) 

列表渲染

遍历1

// 准备数据
state = {list :['小苹果','大香蕉','黄橙子']
}return (<ul>{this.state.list.map(item => { return <li>{ item }</li>}) }
</ul>)

遍历2

// 准备数据
state = {list2: [{ id: 1, name: '春' }, { id: 2, name: '飞' }, { id: 3, name: '莲' }]
}
// 遍历return (<ul>{this.state.list2.map(item => { return <li key={item.id}>{ item.name }</li>}) }</ul>)

提取到函数

// render 钩子函数
render () {return (<ul>{ this.renderLi()  }</ul>)}// 提取到的一个函数
// 必须要有返回值
renderLi () { return this.state.list2.map(item => { return <li key={item.id}>{ item.name }</li>}) 
}

处理样式

行内样式

// 这个{{}} 不是双括号语法,  而是单括号里面有个 样式对象
//{} 可以拿到原始类型
<div style={{ color: 'pink', backgroundColor: 'yellowgreen', height: 300 }}>

外联样式

//1. 外部 index.css
.red {color: red;font-size: 50px;
}//2. 引入
import './index.css'//3. 添加类<p className='red' >哈哈</p>

评论案例

步骤

  • 准备数据 - 列表展示

  • 受控组件

  • 表单头部展示收集数据

  • 补充 : 非受控组件

评论案例1 : 列表展示

  • 准备数据
 list: [{ id : 1, username :'张三', content :'做一个凡人' },{ id : 2, username :'李四', content :'贪财好色' },{ id : 3, username :'王五', content :'一身正气' }],
  • 展示
<ul>{this.state.list.map(item => { return (<li key={item.id}><p>评论人 : {item.username}</p><p>评论内容 : {item.content}</p></li>)}) }
</ul>

评论案例2 : 受控组件

  • 见下面的受控组件模块

评论案例3 : 头部展示

  • 结构
<div>评论的人 :<inputonChange={e => this.getValues('username', e.target.value)}    # +name="username"value={username}style={{ width: '214px' }}type="text"/><br />评论内容 :<textareaonChange={e => this.getValues('content', e.target.value)}    # +name="content"value={content}cols="30"rows="10"></textarea><button onClick={this.add}>添加评论</button>
</div>
  • 处理表单数据
getValues = (name, value) => {this.setState({[name]: value})
}
  • 添加评论
  add = () => { // 获取数组const { list, content, username } = this.state let obj = {id: +new Date(),content,name : username}this.setState({list: [obj, ...list],content: '',username :''}) }

评论案例4 : 非受控组件

  • 见 下面 非受控组件模块

受控组件

导入 : 给 input 添加了一个value ,展示默认值

受控组件介绍

  • 表单元素 是用来收集数据的

  • react 表单元素分为 : 受控组件 + 非受控组件

  • 受控组件 : 受 React 控制的组件

  • 如何成为受控组件 ? 给 input 添加value 值, 那么这个input 就成了受控组件

  • M ==> V , V ==> M (我们自己处理)

- 1.需要给 input 添加 value 并且赋值 =>  M ==> V
- 2.onChange={ this.handleInput } ==> 监听 V 的数据变化, 收集值赋值给 M  
- 3. handleInput = (e) =>  {// 监听input 的变化//  (V) 拿到文本框的值, 修改 state 里面的数据(M)console.log(e,target.value)// 修改状态this.setState({username : e.target.value})}

其他表单处理受控组件

// 文本输入框
<input onChange={this.handleInput} value={username} type="text" />  <br />
// 文本域
<textarea onChange={this.handleTextarea} value={content} cols="30" rows="10"></textarea>
// 下拉框
<select value={city} onChange={this.handleSelect}><option value="sh">上海</option><option value="hz">杭州</option><option value="bj">北京</option>
</select>
  • 处理
  // 处理 input handleInput  = (e) => { this.setState({username: e.target.value})}// 同上
.....

优化1

// 让其他表单都绑定到一个事件中
// 文本输入框
<input name='username' onChange={this.handleInput} value={username} type="text" />  <br />
// 文本域
<textarea name='content' onChange={this.handleTextarea} value={content} cols="30" rows="10"></textarea>
// 下拉框
<select name='city' value={city} onChange={this.handleSelect}><option value="shanghai">上海</option><option value="hangzhou">杭州</option><option value="beijing">北京</option>
</select>
  • 处理
  handle = e => { // console.log(e.target.name);this.setState({[e.target.name] : e.target.value})}

优化2

// 文本输入框
<input  onChange={(e) => this.getValues('username', e.target.value)} value={username} type="text" />  <br />
// 文本域
<textarea onChange={(e) => this.getValues('content', e.target.value)} value={content} cols="30" rows="10"></textarea>
// 下拉框
<select value={city} onChange={ (e) => this.getValues('city', e.target.value) }><option value="shanghai">上海</option><option value="hangzhou">杭州</option><option value="beijing">北京</option>
</select>
  • 处理
 getValues = (name, value) => { this.setState({[name] : value})}

非受控组件

导入 : 如果不想让inptu 成为受控组件 , 又想添加默认值

####非受控组件介绍:

  • 添加 defaultValue : <input type="text" defaultValue={this.state.name} />
  • 它默认就是一个非受控组件
  • 非受控组件操作 DOM 直接获取 数据 – 通过 ref

使用步骤

  • 1-创建 ref 引用
constructor(){super()// 方式1this.iptRef = React.createRef()
}
// 和 state 一样
// 方式2: 属性初始化语法
iptRef = React.createRef()
  • 2-绑定 ref
<input ref={ this.iptRef } />
  • 3-获取数据
// 可以通过尝试点击按钮
click = () => {console.log(this.iptRef.current.value)
}

组件通讯

父传子

  • 通过普通的props属性传递, 实现父传子即可
// 父组件
class Parent extends React.Component {// 1. 准备好数据state = {pName : '父的数据'}render() {return (<div><p>哈哈</p>//2. 通过属性 将数据传递给子组件<Child name={this.state.pName}></Child></div>)}
}
// 子组件  
// 3. 通过 props 获取数据
const Child = (props) => <div>子组件 { props.name }</div>

子传父

  • 思路 : 父组件中提供了一个方法, 由子组件调用这个方法, 将数据作为参数传递给父组件
  • 步骤 :
    • 1-在父组件中提供一个方法
    • 2-将这个方法通过属性传递给子组件
    • 3-子组件中通过props 拿到这个方法调用, 并且将数据作为参数传递
// 父组件
class Parent extends React.Component {// 第一步 :父组件准备一个方法pFn = (data) => { console.log('调用了',data);}render() {return (<div><p>哈哈</p>{/* 第二步 : 通过属性将方法产传递给子组件 */}<Child cfn={ this.pFn } ></Child></div>)}
}
// 子组件  
class Child extends React.Component { render () { return (<div><button onClick={this.sendMsg}>点击发送</button></div>)}sendMsg = () => { // 第三步 : 子组件通过props 拿到这个方法, 并且传参this.props.cfn('撩汉子')}
}

兄弟组件通讯

  • 思路 : 状态提升

改造评论案例 ★

  • 组件化

    • index.js => Comments父组件
    • components/
      • CommentsList.js ==> CommentsList 列表组件
      • CommentsLForm.js ==> CommentsLForm 表单组件
  • 父传子 => 把 list 传给 CommentsList 组件 => 遍历展示列表

  • 子传父 => 把表单里的数据新对象 => 点击添加评论 => 传给 Comments组件

  • pGetData

  • 添加评论

context

  • 使用场景 : 跨多层组件传递数据
    • 如果两个组件是 远房亲戚 的关系,此时,就可以使用 Context 来通讯。
  • 画图 : One > Two > Three > Four
  • Context 中提供了两个组件
    • Provider 组件 : 提供组件, 提供数据
    • Consumer 组件 : 消费组件, 接收数据
// 1. 创建 Context 对象, 并解构出来两个组件
const { Provider, Consumer } = React.createContext()    # +//2. 类组件
class One extends React.Component {state = {color :'red'}render() {return (// 第二步 : 使用 Provider 组件包裹 one组件, 只有被包裹的部分里面才能获取数据 // 通过 value 属性提供要共享的数据<Provider value={ this.state.color }>          # +<div><p> One </p><Two></Two></div></Provider>)}
}
class Two extends React.Component {
....
}
class Three extends React.Component {....
}
class Four extends React.Component {render() {return (<div><p>Four</p>{/* 3.在 Four 组件中, 通过 consumer 来获取数据 */}{/* 遵循的是 render-props 思想 后面介绍 */}<Consumer>{data => { return <p style={{ color : data }} >这是测试用的</p>   # +}}</Consumer></div>)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

componentsJoinedByString 和 componentsSeparatedByString 的方法的区别

将string字符串转换为array数组 NSArray *array [Str componentsSeparatedByString:","]; &#xff1d;&#xff1d;反向方法 将array数组转换为string字符串 NSString *tempString [mutableArray componentsJoinedByString:","];--,是分隔符 可不加分隔…

java中的各种数据类型在内存中存储的方式

转载别人的附上链接&#xff1a;https://blog.csdn.net/zj15527620802/article/details/80622314 1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题。&#xff08;其中包括两部分&#xff09; 分配&#xff1a;内存的分配是由程序完成的&#xff0c;程序员需要通…

vscode的 jsonp 配置文件

{ // 工具-字体大小 “editor.fontSize”: 15, // 工具-tab缩进 “editor.tabSize”: 2, // 工具-在视区宽度换行 “editor.wordWrap”: “on”, // 工具-缩放 “window.zoomLevel”: 1, // 工具-编写tab识别语言格式 “emmet.includeLanguages”: { “vue-html”: “html”, “…

NSString拼接字符串和NSPredicate详解

NSString* string; // 结果字符串 02 NSString* string1, string2; //已存在的字符串&#xff0c;需要将string1和string2连接起来 03 04 //方法1. 05 string [[NSString alloc]initWithFormat:"%,%", string1, string2 ]; 06 07 //方法2. 08 string [string1 …

线程模块

信号量 from threading import Semaphore,Thread import timedef func(a,b):time.sleep(1)sem.acquire()print(ab)sem.release()sem Semaphore(4) for i in range(10):t Thread(targetfunc,args(i,i5))t.start() 信号量事件 # 事件被创建的时候&#xff0c;默认为False状态 #…

React中级学习(第一天)

Props深入 children 作用 : 获取组件标签的 子节点获取方式 : this.props.children <App>此处的内容&#xff0c;就是组件的 children&#xff0c;将来通过组件的 props.children 就可以获取到这些子节点了 </App>props 校验 作用&#xff1a;规定组件props的类…

iOS 正则表达式判断纯数字以及匹配11位手机号码

1用正则表达式 //是否是纯数字(BOOL)isNumText:(NSString *)str{NSString * regex "(/^[0-9]*$/)";NSPredicate * pred [NSPredicate predicateWithFormat:"SELF MATCHES %", regex];BOOL isMatch [pred evaluateWithObject:st…

Elasticsearch集成ik分词器

1、插件地址https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.0.0/elasticsearch-analysis-ik-7.0.0.zip 2、找到对应版本的插件通过 http://192.168.1.8:9200查看ES的版本&#xff0c;找到对应的IK分词插件 下载与之对应的版本https://github.com/me…

React中级学习(第二天)

JSX 语法的转化过程 (了解) 演示 : babel中文网试一试 let h1 JSX 仅仅是createElement() 方法的语法糖 (简化语法)JSX 语法 被 babel/preset-react 插件编译为 createElement() 方法React 元素&#xff1a;是一个对象&#xff0c;用来描述你希望在屏幕上看到的内容React 元素…

【】MTCNN基于NCNN的测试过程

前言 操作过程 NCNN: https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-linux-x86; vector初始化&#xff1a;int num[4] { 1, 4, 3, 2 }; int numLength sizeof(num) / sizeof(num[0]); vector<int> nums(num, num numLength); //使用数组初始化向量 Q&…

iOS NSTextAttachment - 图文混排

苹果在iOS7中推出了一个新的类NSTextAttachment&#xff0c;它是做图文混排的利器&#xff0c;本文就是用这个类&#xff0c;只用50行代码实现文字与表情混排&#xff0c;当然也可以实现段落中的图文混排。 首先说一下文字和表情的混排&#xff1a; 先来做点儿准备工作&#…

vuex的结构有哪些参数?

查看参考地址&#xff1a; https://vuex.vuejs.org/zh/ vuex 状态管理模式&#xff0c;相当于数据的中间商 注意&#xff1a; 为相同 属性有&#xff1a; 1.State vue中的data —> 存放数据 2.Getter vue中的计算属性computed —>将已有的数据进行计算再次利用 3.…

百炼OJ - 1004 - 财务管理

题目链接&#xff1a;http://bailian.openjudge.cn/practice/1004/ 思路 求和取平均。。。 #include <stdio.h>int main() {float sum0,a;for(int i0;i<12;i){scanf("%f",&a);sum a;}printf("$%.2f\n",sum/12);return 0; } 转载于:https://w…

iOS 自定义Cell按钮的点击代理事件

在实际开发工作中&#xff0c;我们经常会在自定义的Cell中布局一些按钮&#xff0c;并且很多时候我们会在点击这个按钮的时候使我们的UItableviewController跳转到下一界面&#xff0c;有的可能还要传值。那么如何使我们的控制器能够获知我们按下了cell的按钮呢&#xff1f;毫无…

Google 开源技术protobuf 简介与样例

今天来介绍一下“Protocol Buffers ”&#xff08;以下简称protobuf&#xff09;这个玩意儿。本来俺在构思“生产者/消费者模式 ”系列的下一个帖子&#xff1a;关于生产者和消费者之间的数据传输格式。由于里面扯到了protobuf&#xff0c;想想干脆单独开一个帖子算了。 ★prot…

VUE全局导航守卫、 请求、响应拦截器 的设置

文件设置参考地址&#xff1a;https://gitee.com/wang_yu5201314/headlines__news/tree/master/%E9%A1%B9%E7%9B%AE%E6%BA%90%E7%A0%81%E6%96%87%E4%BB%B6/src 文件夹 Router 文件夹 index.js 中设置 全局导航守卫 文件 mian.js 中设置 请求、响应拦截器 设置 请求、响应拦截器…

JRE System Library和 Referenced Libraries 的区别和来源

JRE System Library 安装jdk后&#xff0c;会有个目录叫做jrejre目录是核心类库&#xff0c;目录中装的是类库文件jre System Library顾名思义就表示系统类库文件 Referenced Libraries referenced libraries放的是你引用的jar包&#xff0c;这个不需要自己创建的&#xff0c;你…

ByteArray、16进制、字符串之间的转换

ByteArray、16进制、字符串之间的转换&#xff1a; package fengzi.convert {import flash.utils.ByteArray;public class ByteArrayTranslated{/**** 通过hax数据返回ByteArray* param hax 格式 "AA5A000100FF"***/public static functi…

js - (初中级)常见笔试面试题

1.用 js 实现一个深拷贝 2.用 js 写一个数组去重 3. 用 js 对字符串进行反转 4. 用 js 请求范围内的质数个数 5.用 js 求数组中出现最多的数及其出现次数

iOS 支付宝SDK接入详解

一&#xff0c;在支付宝开放平台下载支付宝SDK&#xff08;https://openhome.alipay.com/platform/document.htm#down&#xff09; https://doc.open.alipay.com/doc2/detail.htm?spma219a.7629140.0.0.HpDuWo&treeId54&articleId104509&docType1 二&#xff0c;添…