React学习笔记4---react属性与状态

1. 属性的含义和用法

用this.props引用属性

用法:

1》.键值对式:

<Hello name=? /> ?可以是{。。。}或字符串“ ”,数组{[...]},或变量{val}

2》. 展开对象式:

var props = {

one:"123",

two:333

}

<Hello{...props} />

3》. 调用setProps式 ; 很少用到

var i =React.render(<Hello></Hello>,document.body);

i.setProps({name:"123"})


实例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="build/react.js"></script>
    <script src="build/JSXTransformer.js"></script>
</head>
<body>
    <script type="text/jsx">
        var style = {
            color : "red",border: "1px #000 solid"
        };
        var HelloWorld = React.createClass({
            render: function () {
                //在展开式形式下载return中添加 Hello,{this.props.name1 + this.props.name2}
                //在键值形式下载return中添加: Hello,{this.props.name1 ? this.props.name:"World"}
                return <p ref="childp">
                    Hello,{this.props.name1 + this.props.name2}
                </p>
            },});
        var HelloUnivers = React.createClass({
            getInitialState: function(){
                //用展开式方式
                return {
                    name1:'Tim',name2:'123'
                };
            },handleChange:function(event){
                this.setState({name: event.target.value});
            },render:function(){
                //<!--1. 用键值对方式赋值,name属性名,{状态的内容}-->
                //在return中写入<!--<HelloWorld name={this.state.name}></HelloWorld>-->
                return <div>
                    <HelloWorld {...this.state}></HelloWorld>
                    <br/>
                    <input type="text" onChange={this.handleChange}/>
                </div>
            },})
        React.render(<div style={style}>
            <HelloUnivers></HelloUnivers>
        </div>,document.body);
    </script>
</body>
</html>


2 . 状态的含义和用法

state : 事物所处的状况,由事物处理,不断变化

状态的用法:

  • getInitialState: 初始化每个实例特有的状态
  • setState: 更新组件的状态
setState触发的行为:
setState ----》 diff算法-----》变化?更新DOM
在上一个代码中的一段 监听属性是否改变,改变,则在render中更新DOM
handleChange:function(event){
                this.setState({name: event.target.value});
            },


4. 属性和状态对比:

相似点:
  • 都是纯JS对象,
  • 都会触发render的更新行为
  • 都具有确定性
不同点:

....................................................属性...........状态
从父组件中获取初始值..................y..................n
由父组件修改................................y..................n
在组件内部设置默认值..................y..................y
在组件内修改................................n..................y
设置子组件的初始值.....................y..................n
修改子组件的值............................y...................n


状态只和自己相关,属性不能从自己修改


区分方法:
组件在运行时需要修改的数据就是状态。


实例
1》项目分析
文章评论框:
step1 : 分析构成项目的组件,
评论框 (父): 评论对象(属性)
包含内容(子) :(状态)
step2: 分析组将的关系及数据传递
step3: 编写代码:


2》编写第一版代码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="build/react.js"></script>
    <script src="build/JSXTransformer.js"></script>
</head>
<body>
<script type="text/jsx">
    //内容组件(子组件)
    var Content = React.createClass({
        //将评论对象传递给子组件
        getInitialState: function () {
            return {
                inputText:'',};
        },//监听内容的变化并且记录在状态中
        handleChange: function(event){
            this.setState({inputText: event.target.value});
        },//添加提交按钮并打印结果
        handleSubmit: function () {
            console.log("reply To" + this.props.selectName + "\n"
                     + "\n" + this.state.inputText);
        },render: function () {
            return <div>
                <textarea onChange={this.handleChange} placeholder="please enter something....">
                </textarea>
                <button onClick={this.handleSubmit}>submit</button>
            </div>;
        },});
    //评论框组件(父组件)
    var Comment = React.createClass({
        //动态提取option
        getInitialState: function () {
            return {
                names: ["Tim","John","Hank"],selectName: '',// 将监听到的修改内容传递给Content
        handleSelect: function (event) {
            this.setState({selectName: event.target.value});
        },//用下拉列表展示回复对象
        render: function () {
            var options = [];
            for (var option in this.state.names) {
                options.push(<option value={this.state.names[option]}>
                    {this.state.names[option]}
                </option>)
            }
            ;
            return <div>
                <select onChange={this.handleSelect}>
                    {options}
                </select>
                <Content selectName={this.state.selectName}></Content>
            </div>;
        },})
    React.render(<Comment></Comment>,document.body);
</script>
</body>
</html>


3》修复bug









视屏来源: www.jikexueyuan.com

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom