JSX运用

JSX

且看这段代码,并不符合我们认识的javascript语法,好像在javascript中加载了html(xml),但是它却能(经过babel的解析)正确工作.

class HelloWorld extends React.Component {
      render(){
        return  <div>{msg}</div>  
      }
}

这种语法我们称为JSX,是一个 JavaScript 的语法扩展。我们建议在 React 中配合使用 JSX,JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。JSX 可能会使人联想到模板语言,但它具有 JavaScript 的全部功能。

JSX中嵌入表达式

在JSX中,我们可以在**{}**中书写表达式. 我们列举几种情况,来说明 JSX中的语法规则. JSX应该嵌入js表达式,什么是表达式呢?

表达式是由运算符构成,并运算产生结果的语法结构 .

*例子1: *
声明变量,没有返回值,无法正确渲染:

class HelloWorld extends React.Component {
      render(){
        return (
          <div>
            { var a = 10  }
          </div>
        )
      }
    }

直接使用,或者三元表达式,可以正确渲染:

class HelloWorld extends React.Component {
      render(){
        return (
          <div>
            { 10 }
          </div>
        )
      }
    }

class HelloWorld extends React.Component {
      render(){
        return (
          <div>
            { 1>0?10:20 }
          </div>
        )
      }
    }

*例子2: *
直接渲染对象,和直接渲染函数,都会报错:

class HelloWorld extends React.Component {
      render(){
        return (
          <div>
            { new Date() }
          </div>
        )
      }
    }

class HelloWorld extends React.Component {
      render(){
        return (
          <div>
            { ()=>2 }
          </div>
        )
      }
    }

image.png


 

image.png


获得转换后的结果,返回字符串类型,可以正确渲染:

class HelloWorld extends React.Component {
      render(){
        return (
          <div>
            { new Date().getTime() }
          </div>
        )
      }
    }

例子3: **
for循环没有产生结果,所以
不是表达式**:

class HelloWorld extends React.Component {
      render(){
        return (
          <ul>
            for(var i = 0 ; i < 10 ; i ++){
              <li>{i}</li>
            }
          </ul>
        )
      }
    }

如果采用map,本身会返回内容,则可以正确渲染:
这里为了避免报错,key暂且使用下标.

class HelloWorld extends React.Component {
      render(){
        return (
          <ul>
            {
              Array(10).fill(null).map((item,index)=>(
                <li key={index}>{index}</li>
              ))
            }
          </ul>
        )
      }
    }

例子4: **
if逻辑判断语句,没有返回内容,则
不会正确渲染**:

class HelloWorld extends React.Component {
      render(){
        return (
          if(true){
            <div>今天好心情!</div>
          }else{
            <div>今天很生气!</div>
          }
        )
      }
    }

三元运算符,会产生结果,可以正确渲染:

class HelloWorld extends React.Component {
      render(){
        return (
          1>2? (<div>今天好心情!</div>): (<div>今天很生气!</div>)
        )
      }
    }

例子4: **
对象渲染,采用forEach对属性进行遍历,因为
forEach**返回值为undefined,所以无法得到正确结果:

var user = {
      name: '张三',
      age: 20,
      sex: '男'
    }
// 直接渲染对象会报错
class HelloWorld extends React.Component {
      render(){
        return (
          <div>
            { user }
          </div>
        )
      }
    }
// 或者
class HelloWorld extends React.Component {
  render(){
    return (
      <div>
        {
          Object.keys(user).forEach(item=>{
            <p>{item}</p>  
          })
        }
      </div>
    )
  }
}

采用map,可以得到返回值,可以正确渲染:

var user = {
      name: '张三',
      age: 20,
      sex: '男'
    }
    class HelloWorld extends React.Component {
      render(){
        return (
          <div>
            {
              Object.keys(user).map(item=>(
                  <p>{item}</p>  
              ))
            }
          </div>
        )
      }
    }

*例子5: *
数组可以直接渲染:

var arr = [1,2,3,4];
    class HelloWorld extends React.Component {
      render(){
        return (
          <div>
            { arr }
          </div>
        )
      }
    }

JSX的样式

style行内样式:
style是个双{},因为首先需要定义一个js表达式作用域,然后style属性接收一个对象类型.样式名需要转换为驼峰形式.

var arr = [1,2,3,4];
class HelloWorld extends React.Component {
  render(){
    return (
      <div style={{color: 'red',fontSize: '20px'}}>
        { arr }
      </div>
    )
  }
}
// 或者
var arr = [1,2,3,4];
var style = {color: 'green',fontSize: '20px'};
class HelloWorld extends React.Component {
  render(){
    return (
      <div style={style}>
        { arr }
      </div>
    )
  }
}

class样式:
在JSX中,属性不应该采用关键词,比如class,if,for等,样式应该书写在 className中:

<style>
    .danger{
      color: red;
    }
    .large{
      font-size: 30px;
    }
</style>

class HelloWorld extends React.Component {
      render(){
        return (
          <div className={'danger large'}>
            { arr }
          </div>
        )
      }
}

JSX中的注释

// 这种注释是不行的 
class HelloWorld extends React.Component {
      render(){
        return (
          <div className={'danger large'}>
            // className和class属性是一样的,而且必须是驼峰
            { arr }
          </div>
        )
      }
    }
// 必须把注释部分变成表达式作用域,再注释
class HelloWorld extends React.Component {
      render(){
        return (
          <div className={'danger large'}>
            { /* className和class属性是一样的,而且必须是驼峰 */ }
            { arr }
          </div>
        )
      }
    }

JSX中的属性
JSX中的属性,必须采用驼峰命名:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React 高阶函数可以在许多场景中运用,以下是一些常见的应用示例: 1. 权限控制:通过高阶函数可以实现对组件的访问权限控制。例如,可以创建一个名为 `withAuth` 的高阶函数,它根据用户的登录状态来决定是否渲染原始组件。 ```jsx function withAuth(WrappedComponent) { return function WithAuth(props) { const isLoggedIn = checkUserLoginStatus(); // 检查用户登录状态的函数 if (isLoggedIn) { return <WrappedComponent {...props} />; } else { return <div>请先登录</div>; } } } const MyComponent = () => <div>需要登录才能看到的内容</div>; const AuthComponent = withAuth(MyComponent); // 使用增强后的组件 <AuthComponent /> ``` 2. 数据获取:通过高阶函数可以封装数据请求逻辑,使组件可以方便地获取数据并进行渲染。例如,可以创建一个名为 `withDataFetching` 的高阶函数,它负责从 API 获取数据,并将数据作为 props 传递给原始组件。 ```jsx function withDataFetching(WrappedComponent, url) { return function WithDataFetching(props) { const [data, setData] = useState(null); useEffect(() => { fetchData(); }, []); async function fetchData() { try { const response = await fetch(url); const jsonData = await response.json(); setData(jsonData); } catch (error) { console.error('Error fetching data:', error); } } return <WrappedComponent {...props} data={data} />; } } const MyComponent = ({ data }) => { if (!data) { return <div>Loading...</div>; } return ( <ul> {data.map(item => ( <li key={item.id}>{item.name}</li> ))} </ul> ); }; const DataComponent = withDataFetching(MyComponent, 'https://api.example.com/data'); // 使用增强后的组件 <DataComponent /> ``` 3. 状态管理:通过高阶函数可以封装一些公共状态,使多个组件可以共享该状态。例如,可以创建一个名为 `withTheme` 的高阶函数,它将主题信息作为 props 传递给原始组件。 ```jsx function withTheme(WrappedComponent) { return function WithTheme(props) { const theme = useContext(ThemeContext); // 使用 Context 获取主题信息 return <WrappedComponent {...props} theme={theme} />; } } const MyComponent = ({ theme }) => ( <div style={{ background: theme.background, color: theme.text }}> 主题样式 </div> ); const ThemedComponent = withTheme(MyComponent); // 使用增强后的组件 <ThemedComponent /> ``` 这些只是一些常见的应用场景,实际上,React 高阶函数非常灵活,可以根据具体需求来定义和使用。它们可以帮助我们在不改变原始组件的情况下,增加、修改或封装组件的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值