目标:能够说出jsx是什么
内容:
JSX
是JavaScript XML
的简写,表示了在Javascript代码中写XML(HTML)格式的代码
优势:声明式语法更加直观,与HTML结构相同,降低学习成本,提高开发效率。
JSX是react的核心内容
注意:JSX 不是标准的 JS 语法,是 JS 的语法扩展。脚手架中内置的 @babel/plugin-transform-react-jsx 包,用来解析该语法。
babel 试一试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqLFybi2-1651765724157)(assets/JSX 声明式vs命令式.png)]
在 babel 的试一试中,可以通过切换 React Runtime 来查看:
总结
目标:掌握在react项目中如何使用jsx
内容
核心代码
import ReactDOM from 'react-dom'
// 创建元素
const title =
// 渲染元素
ReactDOM.render(title, document.getElementById('root'))
总结
目标: 了解在使用jsx时需要注意的事项
内容:
JSX必须要有一个根节点, 如果没有根节点,可以使用<>>
(幽灵节点)或者
所有标签必须结束,如果是单标签可以使用/>
结束
JSX中语法更接近与JavaScript,
属性名采用驼峰命名法
class
===> className
for
===> htmlFor
JSX可以换行,如果JSX有多行,推荐使用()
包裹JSX,防止 JS 自动插入分号的 bug
注意
目标:学习如何配置vscode插件进行代码格式化和jsx自动补全
内容
// 保存的时候用使用prettier进行格式化
"editor.formatOnSave": true,
// 默认使用prittier作为格式化工具
"editor.defaultFormatter": "esbenp.prettier-vscode",
// 不要有分号
"prettier.semi": false,
// 使用单引号
"prettier.singleQuote": true,
// react
// 当按tab键的时候,会自动提示
"emmet.triggerExpansionOnTab": true,
"emmet.showAbbreviationSuggestions": true,
"emmet.includeLanguages": {
// jsx的提示
"javascript": "javascriptreact",
"vue-html": "html",
"vue": "html",
"wxml": "html"
},
// end
总结
目标:掌握在jsx中使用表达式的语法
vue的差值表达式(胡子语法):{{data === js表达式}}
内容:
console.log( 表达式 )
{ JS 表达式 }
你好,我叫 {name}
核心代码
const name = 'zs'
const age = 18
const title = (
姓名:{name}, 年龄:{age}
)
const car = {
brand: '玛莎拉蒂'
}
const title = (
汽车:{car.brand}
)
const friends = ['张三', '李四']
const title = (
汽车:{friends[1]}
)
const gender = 18
const title = (
是否允许进入:{age >= 18 ? '是' : '否'}
)
function sayHi() {
return '你好'
}
const title = 姓名:{sayHi()}
const span = 我是一个span
const title = JSX 做为表达式:{span}
{/* 这是jsx中的注释 */} 快键键 ctrl + /
总结
if
、for
、while
等目标:掌握在react中如何根据条件渲染结构
vue条件渲染:v-if / v-show
内容
if/else
或三元运算符
或逻辑与(&&)运算符
核心代码
if/else
控制const isLoding = false
const loadData = () => {
if (isLoding) {
return 数据加载中.....
} else {
return 数据加载完成,此处显示加载后的数据
}
}
const title = 条件渲染:{loadData()}
const isLoding = false
const loadData = () => {
return isLoding ? (
数据加载中.....
) : (
数据加载完成,此处显示加载后的数据
)
}
const isLoding = false
const loadData = () => {
return isLoding && 加载中...
}
const title = 条件渲染:{loadData()}
总结
if/else
或三元运算符
或逻辑与(&&)运算符
实现条件的渲染练习
// 定义一个变量 isLogin
// 如果登录了,显示:欢迎你,尊贵的v10用户
// 如果没有登录,显示:你好,请先登录
const isLogin = false
const el = isLogin ? 欢迎你,尊贵的v10用户 : 你好,请先登录
目标:掌握react中如何通过数组的map方法实现列表的渲染
vue列表渲染: v-for
内容:
作用:重复生成相同的 HTML 结构,比如,歌曲列表、商品列表等
实现:使用数组的 map
方法
注意⚠️:需要为遍历项添加 key
属性
如果列表中没有像 id 这种的唯一值,就可以使用 index(下标)来作为 key 值
核心代码
const songs = [
{ id: 1, name: '痴心绝对' },
{ id: 2, name: '像我这样的人' },
{ id: 3, name: '南山南' }
]
const list = songs.map(song => {song.name} )
const dv = (
{list}
)
const songs = [
{ id: 1, name: '痴心绝对' },
{ id: 2, name: '像我这样的人' },
{ id: 3, name: '南山南' }
]
const dv = (
{songs.map(song => - {song.name}
)}
)
const dv = (
{songs.map(song => (
- {song.name}
))}
)
总结
目标:完成列表渲染的练习
内容:
const list = [
{ id: 1, name: '黑马86期', salary: 11000 },
{ id: 2, name: '黑马87期', salary: 12000 },
{ id: 3, name: '黑马88期', salary: 18000 }
]
// 结构模板:
-
班级:黑马188期
工资:15000
目标:掌握jsx中如何通过style和className控制元素的样式
内容:
数值
即可"60%"
)核心代码:
const dv = (
style样式
)
// 导入样式
import './base.css'
const dv = style样式
总结:
className
// JSX
{ JS 表达式}
使用:案例-B站评论列表-静态结构
**目标:**能够动态渲染评论列表的tab栏
步骤:
核心代码
{/* 评论数 */}
{state.list.length} 评论
{/* 排序 */}
{state.tabs.map((item) => (
-
按{item.name}排序
))}
**目标:**根据list数据渲染评论列表功能
步骤
核心代码:
import avatar from './images/avatar.png'
{/* 评论列表 */}
{state.list.map((item) => (
{item.author}
{item.comment}
{item.time.toString()}
删除
))}
// 不同写法
// 写法1
// 写法2
// 写法3
**目标:**通过moment对时间进行格式化
步骤:
yarn add moment
核心代码:
const formatTime = (time)=> {
return moment(time).format('YYYY-MM-DD HH:mm:ss')
}
{formatTime(item.time)}
转载黑马程序员React笔记 https://gitee.com/heima-class