4.JSX语法

### 1. 认识JSX语法 - 1. ```javascript // 1. 定义根组件 const element =
Hello World
// 2. 创建root并且渲染App组件 const root = ReactDOM.createRoot(document.querySelector('#root')) root.render(element) ``` - 2. 这段`element`变量的声明右侧`div的标签语法`是? - 它不是一段`字符串`(因为没有使用引号包裹) - 它看起来是一段`HTML元素`,但是我们能在`js`中直接给一个`变量赋值html元素` - 其实是不可以的,如果我们将`type = "text/babel"`去除掉,那么就会出现语法错误; - 其实她是一段`JSX的语法`; - 3. `JSX`是? - `JSX是一种Javascript的语法扩展`,也在很多地方称之为`Javascript XML`,因为看起来就是一段`XML语法`; - 它用于描述我们的`UI界面`,并且完全可以和`Javascript`融合在一起使用; - 不同于`Vue中的模板语法`,不需要专门血虚模板语法中的指令(例如:`v-for、v-if、v-else、v-bind`) - 4. 为什么`React选择JSX`? - 1. `React认为渲染逻辑本质上与其他UI逻辑存在内在耦合(html->js->state->html ) ` - 比如`UI`需要绑定事件(`button、a原生`等等) - 比如UI中需要`展示数据状态` - 比如某些`状态发生改变时`,又需要`改变UI`; - 2. 它们之间是`密不可分`,所以`React没有将标记分离到不同的文件中,而是将它们组合到了一起,这个地方就是组件`; - 3. 总结:`JSX其实是嵌入到Javascript中的一种结构语法` ### 2. JSX的基本使用 - 1. JSX的书写规范 - 1.1. `jsx结构中只能有一个根元素` - 1.2. `jsx`结构通常会包裹一个`()`, `将整个jsx当做一个整体,实现换行` - 1.3. `jsx`可以是`单标签`,也可以`双标签`,但是`单标签必须以/>结尾 ` - 2. JSX的注释编写 - ` {/* JSX的注释写法 */} ` - 3. JSX嵌入变量作为子元素 - 情况一: `当变量是Number、String、Array类型时,可以直接显示` - 情况二:` null、undefined、Boolean类型时,内容为空` - 如果希望可以`显示null、undefined、Boolean类型,需要转成字符串`; - 转换的方式有很多,例如:`toString方法、和空字符串拼接,String(变量)等方式` - 情况三: `Object对象类型不能作为子元素(not vaild as a React child)` - 4. JSX嵌入表达式 - 运算表达式 - 三元运算符 - 执行一个函数 - 示例代码如下: ```javascript Document
// 1.定义App根组件 class App extends React.Component { constructor () { super() this.state = { counter: 100, message: 'hello world', names: ['张三', '李四', '王五'], aaa: null, bbb: undefined, ccc: true, friend: { name: 'kobe' }, firstName: 'kobe', lasterName: 'bryant', age : 18, movies: ['流浪地球','星际穿越','独行月球'] } } render () { // 1. 插入标识符 const { counter, message, names } = this.state const { aaa, bbb, ccc} = this.state const { friend } = this.state // 2. 对内容进行呢运算后显示(插入表达式) const { firstName, lasterName } = this.state const fullName = firstName + ' ' + lasterName const { age } = this.state const ageText = age >= 18 ? '成年人' : '未成年' const liEls = this.state.movies.map(movie => <li key={movie}> { movie }</li>) // 3. 返回jsx的内容 return ( <div> {/*1. Number/String/Array直接显示出来 */} <h2>{counter}</h2> <h2>{ message }</h2> <h2>{names.join('、')}</h2> {/* 2. undefined/null/Boolean在页面中不显示,转成字符串可以在页面中*/} <h2>{String(aaa)}</h2> <h2>{bbb + ''}</h2> <h2>{ccc.toString()}</h2> {/* 3. Object类型不能作为子元素进行显示 */} {/* <h2>{friend}</h2> */} {friend.name} {Object.keys(friend)[0]} {/* 4. 可以插入对应的表达式 */} <h2>{ 10 + 20 }</h2> <h2>{ firstName+ ' ' + lasterName }</h2> <h2>{ fullName }</h2> {/* 5. 可以插入三元运算符 */} <h2>{ age >= 18 ? '成年人' : '未成年' }</h2> <h2>{ ageText }</h2> {/* 6. 可以调用方法获取结果 */} <ul>{liEls}</ul> <ul>{this.state.movies.map(movie => <li>{movie}</li>)}</ul> <ul>{this.getMoviesEls()}</ul> </div> ) } getMoviesEls () { const liEls = this.state.movies.map(movie => <li>{movie}</li>) return liEls } } // 2. 创建root并且渲染App组件 const root = ReactDOM.createRoot(document.querySelector('#root')) root.render(<App/>) ``` - 5. jsx绑定属性 - 比如元素都会有`title属性` - 比如img元素会有`src属性` - 比如a元素会有`href属性` - 比如元素可能需要`绑定class` - 比如原生使用内联样式`style` - 示例代码如下: ```javascript Document
// 1.定义App根组件 class App extends React.Component { constructor () { super() this.state = { message: 'hello world', title: '哈哈哈', imgUrl: 'https://miaobi-lite.bj.bcebos.com/miaobi/5mao/b%27LV8xNzMyNzc2NTgzLjA0NTAxODI%3D%27/0.png', href: 'http://www.baidu.com', isActive: true, objStyle: { color: 'red', fontSize: '30px' } } } render () { const { message, title, imgUrl, href, isActive, objStyle } = this.state // 需求: isActive: true -> active // 1. class绑定的写法一: const className = `aaa bbb ${isActive ? 'active' : ''}` // 2. class绑定的写法二: 将所有的class放到数组中 const classList = ['aaa', 'bbb'] if(isActive) classList.push('active') // 3. class绑定的写法三: 第三方库classnames -> npm install classnames return ( <div> {/* 1. 基本绑定 */} <h2 title={ title }>{ message }</h2> {/* <img src={ imgUrl } alt=''/> */} <a href={href}>百度一下</a> { /* 2. 绑定class属性: 做好使用className */} {/* js代码 -> class关键字 -> 用class做为属性名会被浏览器误解*/} <h2 className={className}>哈哈哈哈</h2> <h2 className={classList.join(' ')}>哈哈哈哈</h2> { /* 3. 绑定style属性: 绑定对象类型 */ } <h2 style={{color: 'red', fontSize: '30px'}}>哈哈哈哈哈</h2> <h2 style={objStyle}>哈哈哈哈哈</h2> </div> ) } } // 2. 创建root并且渲染App组件 const root = ReactDOM.createRoot(document.querySelector('#root')) root.render(<App/>) ``` 本文由[mdnice](https://mdnice.com/?platform=6)多平台发布
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容