React 属性和状态的一些总结

本文详细介绍了React中组件的属性和状态的使用方法,包括属性的三种设置方式、状态的初始化及更新方法,并通过示例代码展示了如何在实际项目中应用这些概念。

 

一、属性

  1、第一种使用方法:键值对

     <ClaaNameA name = “Tom” />

    <ClaaNameA name = {Tom} />

    <ClaaNameA name = {“Tom”} />

    <ClaaNameA name = {[1,2,3]} />//数组

    <ClaaNameA name = {FunctionNAme} /> //定义一个函数

 

  2、第二种方法:三个点的展开对象形式

    var props = {

      one :”123”,

      tow :321

     }

    <ClassNameB {…props} />

    增加三个引号相当于这里面拿到两个属性了(one和two)

 

  3、setProps形式:通过组件更新属性,不能在组件内部中修改属性的,因为会违背组件设计原则(尽量避免)

     var instance =React.render(<ClassNameC ><ClaasNameC/>,document.body);

    instance.setProps({name:”Tom" });

 

二、状态:事物所处的状况,由事物自行处理不断变化/事物的私有属性

  getInitialState:初始化每个实例特有的状态

  setState:更新组件状态

  setState会触发diff算法:判断state和页面结果的区别,是否需要更新

 

三、状态和属性对比

  状态和属性都会触发render更新,都是纯JS对象

  状态:是和自己相关的,既不受父组件也不受子组件影响

  属性:本身是不能自己去修改的,只能从父组件获取属性,父组件也能修改它的属性

  根本的区别:组件在运行时需要去修改维护的就是状态

四、简单的demo熟悉一下:

 1 <!DOCTYPE html>
 2 <html>
 3   <head>
 4     <meta http-equiv='Content-type' content='text/html; charset=utf-8'>
 5     <title>daomul's example</title>
 6     <link rel="stylesheet" href="../shared/css/base.css" />
 7   </head>
 8   <body>
 9     <h1>Text demo</h1>
10     <div id="container">
11 
12     </div>
13 
14     <script src="../shared/thirdparty/es5-shim.min.js"></script>
15     <script src="../shared/thirdparty/es5-sham.min.js"></script>
16     <script src="../shared/thirdparty/console-polyfill.js"></script>
17     <script src="../../build/react.js"></script>
18     <script src="../../build/JSXTransformer.js"></script>
19     <script type="text/jsx">
20 
21         //内容组件
22         var Content = React.createClass({
23           getInitialState:function(){
24             return {
25               inputText:'',
26             };
27           },
28           handleChange:function(event){
29             this.setState({inputText:event.target.value});
30           },
31           handleClick:function(){
32             console.log("props name is " + this.props.selectName + " \n and inputText is "  + this.state.inputText);
33           },
34           render:function(){
35 
36             return <div>
37               <textarea onChange = {this.handleChange} placeholder = "please input something!"></textarea>
38               <button onClick = {this.handleClick}>sumbit</button>
39             </div>;
40           },
41         });
42 
43         //评论组件
44         var Comment = React.createClass({
45           getInitialState:function(){
46             return {
47               names:["Tom","Axiba","daomul"],
48               selectName:'',
49             };
50           },
51           handleSelect:function(){
52             this.setState(
53                 {selectName : event.target.value}
54               );
55           },
56           render:function(){
57             var options = [];
58             //往options中添加子option
59             for (var option in this.state.names) {
60               options.push(<option value={this.state.names[option]}> {this.state.names[option]}  </option>)
61             };
62             return <div>
63               <Content selectName = {this.state.selectName}>
64               </Content>
65               <select onChange = {this.handleSelect}>
66                 {options}
67               </select>
68             </div>;
69           },
70         });
71 
72         //start render
73         React.render(<Comment></Comment>,document.body);
74     </script>
75   </body>
76 </html>

 

转载于:https://www.cnblogs.com/daomul/p/4853637.html

<think>好的,用户想了解React中列表渲染的工作原理以及key属性的作用。我需要从React的渲染机制讲起,然后解释列表渲染时的问题,再引入key的作用。记得要结合虚拟DOMdiff算法来说明,同时引用提供的资料中的相关内容。 首先,React的渲染过程涉及创建元素树协调机制。当状态变化时,React会生成新的虚拟DOM树,并与旧的进行比较,这个过程叫做协调(Reconciliation)。列表渲染时,如果没有key,React可能无法正确识别元素,导致性能问题或错误。 接下来,要解释key的作用。key帮助React识别哪些元素改变了,比如被添加或移除。这样在对比新旧虚拟DOM时,React可以更高效地更新,而不是重新渲染整个列表。需要举例说明,比如列表项的顺序变化时,使用key可以避免不必要的重新渲染。 还要提到没有正确使用key的后果,比如使用索引可能导致的问题。同时,引用资料中的React.memouseCallback,说明在列表渲染中结合这些优化手段可以提升性能。 最后,确保回答结构清晰,分点说明,并附上相关问题。引用提供的参考文献,比如引用[1]关于元素树的创建,引用[2][3]关于优化手段memo的使用。注意使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,不过这里可能不需要数学公式,但如果有需要的地方要正确应用。 可能还需要检查是否有遗漏的关键点,比如diff算法的具体比较过程,或者虚拟DOM的结构如何影响列表更新。确保所有技术术语解释清楚,让不同层次的读者都能理解。</think>### React列表渲染与key属性作用解析 #### 一、列表渲染核心机制 1. **虚拟DOM对比原理** React通过虚拟DOM树的对比(Diffing算法)实现高效更新。当渲染列表时,每个列表项会被转化为React元素对象,例如: ```jsx <ul> {items.map(item => <li>{item.text}</li>)} </ul> ``` 此时若缺少key属性React会默认使用数组索引作为标识[^1]。 2. **Diff算法优化规则** React采用同级比对策略,通过以下步骤优化列表更新: - 识别元素类型变化 - 匹配相同key的元素 - 仅更新变化的属性/状态 #### 二、key属性的核心作用 1. **元素身份标识** 使用唯一且稳定的key值(如ID): ```jsx items.map(item => <ListItem key={item.id} />) ``` 可使React准确追踪元素的移动、添加删除,避免以下问题: - 错误复用DOM节点导致状态混乱 - 不必要的子组件重新渲染 - 动画/焦点丢失等副作用 2. **性能优化原理** 当列表顺序变化时: ```jsx // 没有key:所有<li>都会被卸载重建 // 正确key:仅DOM节点移动,组件实例复用 ``` 使用key后Diff算法的时间复杂度从$O(n^3)$优化到$O(n)$[^2]。 #### 三、最佳实践与常见误区 1. **正确使用规范** - ✅ 使用数据唯一标识(如数据库ID) - ✅ 组合多个字段生成稳定key - ❌ 避免使用数组索引(动态列表) - ❌ 禁止随机数(导致频繁重建) 2. **与性能优化结合** 结合`React.memo``useCallback`实现完整优化链: ```jsx const MemoizedItem = React.memo(ListItem); function List() { const renderItem = useCallback(item => <MemoizedItem {...item} />, []); return items.map(item => <div key={item.id}>{renderItem(item)}</div>); } ``` 这种组合可避免父组件更新引发的子组件不必要渲染[^3]。 $$ \text{优化效果公式:} \\ T_{\text{更新}} = O(n) + \sum_{i=1}^{k} C_{\text{组件i}}} $$ ($k$为实际变化的组件数量) #### 四、调试验证方法 1. 通过React DevTools观察组件渲染次数 2. 添加`console.log`验证组件生命周期 3. 使用严格模式检测异常行为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值