React- JSX的基本使用/组件的基本使用
React框架
用于构建用户界面的javascript库- 发送请求获取数据
- 处理数据(过滤、整理格式等)
- 操作dom呈现页面
- 判断this的指向
- class类
- ES6语法规范
- npm包管理器
- 原型、原型链
- 数组常用方法
- 模块化
react基本使用
React脚手架的意义
使用react脚手架初始化项目 初始化项目:npx create-react-app my-app 启动项目,在项目根目录中:npm start 自动跳转浏览器,并且终端中显示succesfullyJSX(React核心内容)
简介
JSX是javascript XML的简写,表示在javascript代码中写XML(html)格式的代码//导入react import React from 'react' import ReactDOM from 'react-dom' // 创建react元素 const title = React.createElement('h1', null, 'hello react !!'); //渲染react元素 ReactDOM.render(title, document.getElementById('root'));
用JSX去做创建元素和渲染元素
//导入react import React from 'react' import ReactDOM from 'react-dom' // 使用JSX创建react元素 const title =注意点: React元素的属性名使用驼峰命名法 特殊属性名:class->className\for->htmlFor\tabindex->tabIndex 没有子节点的React元素可以用/>结束 推荐:使用小括号包裹JSX,从而避免JS中的自动插入分号陷阱hello JSXnnnnnnnn
//使用JSX渲染react元素 ReactDOM.render(title, document.getElementById('root'));
嵌入JS表达式
通过{js表达式} 注意:js中的对象是一个例外,一般只会出现在style属性中 不能在{}中出现语句(比如:if/for等)//导入react import React from 'react' import ReactDOM from 'react-dom' // 使用JSX创建react元素 const name = 'jack' const age = 19 const sayJi = () => "hi react" //JSX自身也是一个js表达式 const dv =我是jsxconst title = (hello JSX 姓名:{name}年龄:{age}
{3 > 5 ? 1 : 0}
{sayJi()}
{ dv} ) //使用JSX渲染react元素 ReactDOM.render(title, document.getElementById('root'));
JS X的条件渲染
场景loading效果 条件渲染:根据条件渲染特定的JSX结构//条件渲染 const isLoading = true //if-else // const loaddata = () => { // if (isLoading) { // returnloading...........// } // return数据加载完成,此处显示加载后的数据// } //三元表达式 // const loaddata = () => { // return isLoading ? (loading...........) : (数据加载完成,此处显示加载后的数据); // } //逻辑与运算符 只能实现显示或隐藏 const loaddata = () => { return isLoading && (loading...........) } const title = (条件渲染: {loaddata()}
) //渲染 ReactDOM.render(title, document.getElementById('root'));
JSX的列表渲染
如果要渲染一组数据,应该使用数组的map方法 注意:渲染列表时应该添加key属性,key属性的值要保证唯一 原则:map()遍历谁,就给谁添加key属性 注意:尽量避免使用索引号作为key//列表渲染 //列表 const songs = [ { id: 1, name: '冰雨' }, { id: 2, name: '背叛' }, { id: 3, name: '晴天' } ]; const list = (
-
{songs.map(item =>
- {item.name} )}
JSX样式处理
1.行内样式-style//样式 const list = (JSX样式) ReactDOM.render(list, document.getElementById('root'));
2.类名-className
.title{ text-align: center; }
React组件基础
组件介绍
- 组件表示页面中的部分功能
- 组合多个组件实现完整的页面功能
- 特点:可复用、独立、可组合
组件的两种创建方式
1.使用函数创建组件 函数组件:使用JS的函数(或者箭头)创建的组件 约定1:函数名称必须以大写字母开头 约定2:函数组件必须有返回值,且返回值表示改组件的结构//函数组件 function Hello() { return (这是第一个函数组件) } ReactDOM.render(< Hello />, document.getElementById('root'));
const Hello = () => (2.使用类创建组件 类组件:使用ES6的class创建的组件 约定1:类名称也必须是大写字母开头 约定2:类组件应该继承React.Component父类中提供的方法或属性 约定3:类组件必须提供render()方法 约定4:render()方法必须有返回值,表示改组件的结构这是第一个函数组件) ReactDOM.render(< Hello />, document.getElementById('root'));
//创建类组件 class Hello extends React.Component { render() { return (这是第一个类组件) } } ReactDOM.render(< Hello />, document.getElementById('root'));
把组件抽离为独立的JS文件
import React from 'react' //创建组件 class Hello extends React.Component { render() { return (hello ————————) } } //导出组件 export default Hello
引入组件
//导入Hello组件 import Hello from './Hello' ReactDOM.render(< Hello />, document.getElementById('root'));
React事件处理
//事件处理 class App extends React.Component { //事件处理程序 handleClick() { console.log('单机事件触发!!!'); } render() { return ( ) } } ReactDOM.render(< App />, document.getElementById('root'));
//通过函数组件绑定事件 function App() { //事件处理程序 function handleClick() { console.log('函数组件中事件绑定'); } return ( ) } ReactDOM.render(< App />, document.getElementById('root'));
事件对象
//事件对象 class App extends React.Component { handleClick(e) { e.preventDefault() console.log('a标签的单机事件触发了'); } render() { return ( this.handleClick}>点击,不会跳转 ) } } ReactDOM.render(< App />, document.getElementById('root'));
有状态组件和无状态组件
函数组件又称无状态组件,类组件又称有状态组件 状态叫数据 函数组件没有自己的状态,只负责数据显示 类组件有自己的状态,负责更新UI,让页面动起来 state的基本使用 状态(state)即数据,是组件内部的私有数据,只能在组件内部使用 state的值是对象,表示一个组件中可以有多个数据//state的基本使用 class App extends React.Component { // constructor() { // super() // //初始化state // this.state = { // count: 0 // } // } state = { count: 0 } render() { return () } } ReactDOM.render(< App />, document.getElementById('root'));计数器:{this.state.count}
setState()修改状态
//setState的基本使用 class App extends React.Component { state = { count: 0, test: 'a' } render() { return (注意:) } } ReactDOM.render(< App />, document.getElementById('root'));计数器:{this.state.count}
- 状态是可变的
- 不要直接修改state中的值
- 数据驱动视图
从JSX抽离事件处理程序
事件绑定this指向 1.箭头函数//事件处理程序 class App extends React.Component { state = { count: 0, } onIncrement() { this.setState({ count: this.state.count + 1 }) } render() { return (2.Function.prototype.bind() 将事件处理程序中的this与组件实例绑定道一起) } } ReactDOM.render(< App />, document.getElementById('root'));计数器:{this.state.count}
class App extends React.Component { constructor() { super() this.state = { count: 0, } this.onIncrement = this.onIncrement.bind(this) } onIncrement() { this.setState({ count: this.state.count + 1 }) } render() { return () } } ReactDOM.render(< App />, document.getElementById('root'));计数器:{this.state.count}
第三种方法
class App extends React.Component { constructor() { super() this.state = { count: 0, } } onIncrement = () => { this.setState({ count: this.state.count + 1 }) } render() { return () } } ReactDOM.render(< App />, document.getElementById('root'));计数器:{this.state.count}
表单处理
1.受控组件
- HTML中的表单元素是可输入的,也就是有自己的可变状态
- 而React中可变状态通常保存在state中,并且只能通过setState()方法来修改
- React将state与表单元素值value绑定到一起,由state的值来控制表单元素的值
- 受控组件:其值收到React控制的表单元素
//受控组件,其值受到react控制的表单元素 // 操作文本框的值 class App extends React.Component { state = { txt: '' } handleChange = (e) => { this.setState({ txt: e.target.value }) } render() { return (this.state.txt} onChange={this.handleChange}>) } } ReactDOM.render(< App />, document.getElementById('root'));
//受控组件实例 class App extends React.Component { state = { txt: '', content: '', city: 'gg', isChecked: false } handleForm = (e) => { //获取当前的dom对象 const target = e.target //根据类型获取值 const value = target.type === 'checkbox' ? target.checked : target.value //获取name const name = target.name this.setState({ [name]: value }) } // handleContent = (e) => { // this.setState({ // content: e.target.value // }) // } // handleCity = (e) => { // this.setState({ // city: e.target.value // }) // } // handleChecked = (e) => { // this.setState({ // isChecked: e.target.value // }) // } render() { return ({/* 文本框 */} this.state.txt} onChange={this.handleForm} />) } } ReactDOM.render(< App />, document.getElementById('root'));
{/* 复文本框 */}
{/* 下拉框 */} {/* 复选框 */} this.state.isChecked} onChange={this.handleForm} />
非受控组件
//非受控组件 class App extends React.Component { constructor() { super() //创建ref this.txtref = React.createRef() } //获取文本框的值 getTxt = () => { console.log('文本框的值:', this.txtref.current.value); } render() { return (this.txtref} />) } } ReactDOM.render(< App />, document.getElementById('root'));
案例:评论列表
//案例:评论列表 class App extends React.Component { state = { comments: [ { id: 1, name: 'jack', content: '沙发!!!' }, { id: 2, name: 'tom', content: '沙发!!!' }, { id: 3, name: 'jonh', content: '沙发!!!' }, ], //评论人 userName: '', //评论内容 userContent: '' } //渲染评论列表 renderList() { return this.state.comments.length === 0 ? (暂无评论,快去评论吧) : (
-
{this.state.comments.map(item => (
-
评论人:{item.name}
评论内容:{item.content}
))}
value={this.state.userName} placeholder="请输入评论人"
onChange={this.handleForm} />
{/* 通过条件渲染 */}
{this.renderList()}