React学习之路(2)

44 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情

React(2)

JSX

  • 声明式编程:结果导向的编程

  • 在react中,可以通过jsx创建react元素

  • jsx是js的扩展,jsx使得我们可以以类似于HTML的方式去使用js

  • 要在react中使用jsx,必须要引入babel

  • 引入babel后,要设置代码被babel识别

    <script type="text/babel">
    
    <script type="text/babel">
        const div = <div>
                我是jsx的div
                <button>你好</button>
            </div>
            const root = ReactDOM.createRoot(document.getElementById('root'));
            root.render(div);
        </script>
    

    jsx简化了react创建element

补充
  1. jsx不是字符串,不要加引号

  2. jsx中html标签应该小写开头,react标签大写开头

  3. 在jsx中可以使用{}嵌入表达式

  4. jsx中有且只有一个根标签

  5. jsx中的标签必须正确结束(自结束标签必须加/)

    <input type='text'/>
    
  6. 如果表达式是空值,布尔值,undefined这些值,将不会显示

  7. 在jsx中,属性可以直接在标签中设置

    const div1 = <div id= 'box' onClick={()=>{alert(123)}}></div>
    
  8. jsx中设置style时,需要传一个对象,把样式名变成驼峰命名法

    const div1 = <div id= 'box' onClick={()=>{alert(123)}} style={{backgroudColor:'red',border:'10px red solid'}}></div>
    

渲染列表

{}只能放表达式,不能放语句,

可以把jsx放到语句中

let div;
       let name = '孙悟空';
       let lang = 'en';
       if(lang === 'en'){
           div = <div>hello {name}</div>
       }else if(lang === 'cn'){
           div = <div>你好 {name}</div>
       }

jsx会将数组中的元素自动渲染

 const root = ReactDOM.createRoot(document.getElementById('root'));
    let arr = ['孙悟空','猪八戒','唐僧'];
    const data = arr.map(item => <li>{item}</li>);
    const div = <div>{data}</div>;
    root.render(div);
 const root = ReactDOM.createRoot(document.getElementById('root'));
    let arr = ['孙悟空','猪八戒','唐僧'];
​
    const div = <div>{arr.map(item=><li>{item}</li>)}</div>;
    root.render(div);

虚拟DOM

  1. react通过虚拟dom将react元素和原生dom进行映射,虽然操作的是react元素,但是这些操作最后都会在真实的dom中生效

  2. 虚拟DOM的好处:降低api的复杂度,解决兼容问题,提升性能,减少dom不必要操作,

  3. 每当我们调用roo.render()时,页面就会进行重新的渲染,react会通过diffing算法,将新的和旧的进行比较,通过比较找到发生变化的元素,并且只对变化的元素进行修改,没有发生变化不予处理,

  4. 在比较数据时,react会比较父元素, 父元素如果不同,直接所有元素都替换,父元素一致,在去逐个比较子元素,直到找到所有发生变化的元素为止

  5. 在渲染列表时,通常为列表设计一个唯一的key元素,从而不会让插入元素时,影响性能

  6. 开发过程中一般会采用数据的id作为key

          const data = ['孙悟空','猪八戒','沙僧'];
            const list = <ul>{data.map((item,index) =><li key = {item}>{item}</li>)}</ul>;
        const root = ReactDOM.createRoot(document.getElementById('root'));
        root.render(list);
    

    用索引做key不能解决问题,索引会跟着元素的顺序变化,

    当元素的顺序不会发生变化时,可以用索引做key