我的react学习
基础部分
创建一个react的项目
创建一个react的项目
全局安装 react 指令
// 全局安装react (根据需要安装,不是必须的)
npm i -g react // 或者 yarn -global react // 全局安装 react的脚手架 (创建react的应用,必须安装脚手架)
npm i -g create-react-app // 或者 yarn -global create-react-app
使用脚手架创建应用
create-react-app 应用名称
// 例如创建一个TodoList应用
create-react-app todo-list
注意点:
1.全局安装create-react-app才能使用脚手架创建应用
2.应用名称全部为小写字母,不能出现“TodoList”这样的名称
组件的使用
组件的组成
// React 是react组件必不可少的,用于支持jsx语法的模块,虽然看不到引用,但是不能少
// Component 所有的react的组件都继承于Component,它是react组件的基类
import React, { Component } from 'react'; // TodoItem 自定义的组件
import TodoItem from "./TodoItem" // 定义TodoList组件 ,该组件继承于基类Component
class TodoList extends Component {
/***
* constructor 当前类的构造函数
* props 简单的理解:是父类传递的参数,例如 传递的值 或 方法,它是一个对象
* super(props) 简单的理解是:继承父类中的传递的参数
**/
constructor(props){
super(props)
// state 是 所有react变量的仓储,简单理解就是:当前组件的变量都放在这个对象中
this.state = {
inputValue: "",
List: []
}
// 使用 bind绑定this,让方法中的this永远指向当前的组件(可根据需求改变this的指向)
this.getList = this.getList.bind(this)
this.inputChang = this.inputChang.bind(this)
this.addItem = this.addItem.bind(this)
this.delItem = this.delItem.bind(this)
}
// react组件必不可少的方法,return 返回的是jsx的模板,可以理解为类似html+js的模板
render() {
return (
{/*在jsx中只能有一个根标签,使用<></>(幽灵标签)包裹,既能满足jsx的语法格式,在浏览器解析时不会解析幽灵标签,减少了dom树结构节点 */}
<>
<div>
<input value={this.state.inputValue} onChange={this.inputChang} /> <button onClick={this.addItem}>添加</button>
</div>
<ul>
{this.getList()}
</ul>
</>
);
}; // 遍历输出item
getList() {
...
}
// 动态改变输入框的值
inputChang( e ) {
...
} // 添加item
addItem() {
...
} // 删除item
delItem(index) {
...
}
}
// 导出TodoList
export default TodoList;
认识jsx
简单的jsx的语法
...
render() {
return (
{/*在jsx中只能有一个根标签,使用<></>(幽灵标签)包裹,既能满足jsx的语法格式,在浏览器解析时不会解析幽灵标签,减少了dom树结构节点 */}
<>
<div>
<input value={this.state.inputValue} onChange={this.inputChang} /> <button onClick={this.addItem}>添加</button>
</div>
<ul>
{this.getList()}
</ul>
</>
);
}; ...
在jsx中只能有一个根标签,使用<></>(幽灵标签)包裹,既能满足jsx的语法格式,在浏览器解析时不会解析幽灵标签,减少了dom树结构节点,也可以使用代码片段(Fragments ),效果和<></>相同,只是Fragments 还有更广泛的使用,后面会有详细说明
在jsx中使用注释,多行使用{/* 注释内容 */},单行使用
// 多行 {/* 多行注释内容 */}
{/*
多行注释内容
*/} // 单行
{
// 单行注释内容
}在jsx中使用组件的变量或者方法,使用{}包裹
在jsx中绑定的方法默认this指向undefined,所以需要使用bind绑定this的指向
// 方式1: 在constructor指定this
constructor(props){
super(props)
this.state = {
inputValue: "",
List: []
}
this.getList = this.getList.bind(this)
this.inputChang = this.inputChang.bind(this)
this.addItem = this.addItem.bind(this)
this.delItem = this.delItem.bind(this)
} // 方式2:绑定事件的时候指定this ...
<li onClick={this.delItem.bind(this,index)}></li>
...
组件的基本通讯
最简单的 父 ---> 子 传值
// 父组件通过在子组件标签上设置属性传递数据
<Boy
teacherName={ this.state.teacherName }
/> <Girl
teacherName={ this.state.teacherName }
/> // 子组件通过this.props获取父组件传递的数据
// this.props.teacherName 获取老师的名称
render(){
return (
<>
<p>
我是{this.state.boyName},我的老师是{this.props.teacherName},
我对老师很
<button onClick={()=> this.props.say(this.state.boyName,"满意") } >
满意
</button>
</p>
</>
)
}最简单的 子 ---> 父 通讯
// 父组件通过在子组件标签上设置属性传递数据
<Boy
say = { this.stuSay }
/> <Girl
say = { this.stuSay }
/>
// 子组件通过this.props获取父组件传递的数据
// this.props.say 获取父组件提供的方法,通过调用父组件的方法,将传递的数据作为参数传入,当父组件的方法被调用,就通过获取当前方法参数的方式,得到了子组件传递的数据
render(){
return (
<>
<p>
我是{this.state.boyName},
我对老师很
<button onClick={()=> this.props.say(this.state.boyName,"满意") } >
满意
</button>
</p>
</>
)
}最简单的非父子通讯
核心思路:找到共同的父组件,同时使用父组件传递的值和方法
过程有些复杂,这里省略了
teacher.js
import React,{ Component } from "react"
// 导入 Boy(男孩) 和 Girl(女孩) 组件
import Boy from "./boy"
import Girl from "./girl"
export default class Teacher extends Component {
constructor(props){
super(props)
this.state = {
teacherName: "Tom",
stuName: "",
stuSayContent: "",
boyName: "",
girlName: "",
boySayContent: "",
girlSayContent: ""
}
this.stuSay = this.stuSay.bind(this);
this.boySaySecret = this.boySaySecret.bind(this);
this.grilSaySecret = this.grilSaySecret.bind(this);
}
render(){
let evaluation = false
if (this.state.stuName!=="" && this.state.stuSayContent) {
evaluation = true
}
return (
<>
<p>我是{ this.state.teacherName }老师</p>
<div>
{
evaluation ? (<p>学生评价:{this.state.stuName}对我很{this.state.stuSayContent}</p>) : " "
}
</div>
<Boy
say = { this.stuSay }
teacherName={ this.state.teacherName }
boySaySecret = {this.boySaySecret}
girlSayContent = {this.state.girlSayContent}
/>
<Girl
say = { this.stuSay }
teacherName={ this.state.teacherName }
grilSaySecret = {this.grilSaySecret}
boySayContent = {this.state.boySayContent}
/>
</>
)
}
stuSay(stuName,stuSayContent){
this.setState(()=>{
return {
stuSayContent,
stuName
}
})
}
boySaySecret(constent){
this.setState(()=>{
return {
boySayContent : constent
}
})
}
grilSaySecret(constent){
this.setState(()=>{
return {
girlSayContent : constent
}
})
}
}
boy.js
import React,{ Component } from "react"
export default class Boy extends Component {
constructor(props){
super(props)
this.state = {
boyName: "龙震天"
}
}
render(){
return (
<>
<p>
我是{this.state.boyName},我的老师是{this.props.teacherName},
我对老师很
<button onClick={()=> this.props.say(this.state.boyName,"满意") } >
满意
</button>,
我想对女孩说:<button onClick={()=> this.props.boySaySecret("我喜欢你")}>悄悄话</button>,
她对我说:{this.props.girlSayContent}
</p>
</>
)
}
}
gril.js
import React,{ Component } from "react"
export default class Boy extends Component {
constructor(props){
super(props)
this.state = {
girlName: "怜香玉"
}
}
render(){
return (
<>
<p>
我是{this.state.girlName},我的老师是{this.props.teacherName},
我对老师很
<button onClick={()=> this.props.say(this.state.girlName,"不满意") } >
不满意
</button>,
我想对男孩说:<button onClick={() => this.props.grilSaySecret("我也是")}>悄悄话</button>,
他对我说:{this.props.boySayContent}
</p>
</>
)
}
}
高级部分
待续....
我的react学习的更多相关文章
- React学习笔记-1-什么是react,react环境搭建以及第一个react实例
什么是react?react的官方网站:https://facebook.github.io/react/下图这个就是就是react的标志,非常巧合的是他和我们的github的编辑器Atom非常相似. ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- React学习资料
以下是我整理的React学习资料,包括:React基础.Redux.reat-router, redux middleware, higher order components, React验证等, ...
- React学习笔记(一) 基础知识
现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我. React的基 ...
- React学习系列
React学习系列 系列学习react 翻译地址 https://scotch.io/tutorials/learning-react-getting-started-and-concepts 我是初 ...
- react学习笔记1--基础知识
什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...
- react 学习与使用记录
相关技术:webpack+react+react-router+redux+immutable 郭永峰react学习指南 1.git bash--windows命令行工具 --教程 下载地址 2. i ...
- 【JAVASCRIPT】React学习-JSX 语法
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 JSX 语法 1. 定义 JSX 是javascript + xml 的合集,我们可以将javascript 与 ht ...
- 【JAVASCRIPT】React学习-如何构建一个组件
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 组件化思想 组件就是 UI + UI 交互逻辑,组件有三个常规map , 分别为state 状态 . props 数据 ...
- 【JAVASCRIPT】React学习- 数据流(组件通信)
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 一 组件通信如何实现 父子组件之间不存在继承关系 1.1 父=>子通信 父组件可以通过 this.refs.xx ...
随机推荐
- flutter控件之ListView滚动布局
ListView即滚动列表控件,能将子控件组成可滚动的列表.当你需要排列的子控件超出容器大小,就需要用到滚动块. import 'package:flutter/material.dart'; cla ...
- Android TextEdit属性
EditText继承关系:View-->TextView-->EditText 去掉边框 将EditText属性设置修改 android:background="@null&qu ...
- 6_1 持久化模型与再次加载_探讨(1)_三种持久化模型加载方式以及import_meta_graph方式加载持久化模型会存在的变量管理命名混淆的问题
笔者提交到gitHub上的问题描述地址是:https://github.com/tensorflow/tensorflow/issues/20140 三种持久化模型加载方式的一个小结论 加载持久化模型 ...
- PHP获取用户的真实IP地址
本文出至:新太潮流网络博客 PHP获取用户的真实IP地址,非代理IP function getClientIP(){ global $ip; if(getenv("HTTP_CLIENT_I ...
- kvm 启动libvirtd时出现错误
kvm 启动libvirtd市出现错误: /etc/init.d/libvirtd start启动 libvirtd 守护进程:libvirtd: relocation error: libvirtd ...
- WEB API 支持多种端的后台
一套代码,支持多种平台 1. 支持web 可以js获取webapi的数据源.利用mvvm组织展现在html上. 2.支持安卓. post方法,安卓获取webapi的数据.
- 转载:eclipse 搭建SSH项目(第二篇,有具体的项目例子)
原文地址:http://blog.csdn.net/yeohcooller/article/details/9316923 读博文前应该注意: 本文提纲:本文通过一个用户注册的实例讲解SSH的整合.创 ...
- iOS设计模式 - 访问者
iOS设计模式 - 访问者 原理图 说明 表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 1.Visitor 抽象访问者角色,为该对象结构中具 ...
- Linux 系统调整内核参数
调整系统内核参数 内核优化:Linux系统(内核 + shell + 应用程序) 针对业务服务应用而进行的系统内核参数调整(主要是/etc/sysctl.conf文件) 1. vim /e ...
- 生成器-yield初接触
什么是生成器? 生成器的实质就是迭代器 在python中有三种方式来获取生成器 1. 通过生成器函数 2. 通过各种推导式实现生成器 3. 通过数据的转换也可以获取生成器 将函数中的return换成y ...