React 属性和状态详解

前端之家收集整理的这篇文章主要介绍了React 属性和状态详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

属性的含义和用法

props=properties
属性:一个事物的性质与关系
属性往往是与生俱来的、无法自己改变的.
属性用法
第一种方法:键值对

1、传入一个字符串:”Hi”(字符串)/{“Hi”};
2、传入一个数组{[arry]};
3、传入一个变量{variable}

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <Meta name="Keywords" content="关键词一,关键词二">
    <Meta name="Description" content="网站描述内容">
    <Meta name="Author" content="刘艳">
    <title></title>
</head>
<body>
    <div id = "example"></div>
</body>
</html>
<script src="build/react.js"></script>
<script src="build/react-dom.js"></script>
<script src="build/browser.min.js"></script>
<script type="text/babel"> var HelloWorld = React.createClass({ render: function () { return <p>Hello,{this.props.name ? this.props.name : "World"}</p>; } }); var HelloUniverse = React.createClass({ getInitialState: function () { return {name: ""}; },handleChange: function (event) { this.setState({name: event.target.value}); },render: function () { return( <div> <HelloWorld name = {this.state.name}></HelloWorld> <input type = "text" onChange = {this.handleChange}/> </div> ) } }); ReactDOM.render(<HelloUniverse></HelloUniverse>,document.querySelector("#example")); </script>

运行结果如下,使用的是键值对的方式

第二种方法:可以理解为展开
var props = {one:”hello”,two:”message”}
React提供展开语法…,使用…加对象,react就会把对象中的属性和值,当成是属性的赋值:

<body>
    <div id = "example"></div>
</body>
</html>
<script src="build/react.js"></script>
<script src="build/react-dom.js"></script>
<script src="build/browser.min.js"></script>
<script type="text/babel"> var HelloWorld = React.createClass({ render: function () { return <p>Hello,{this.props.name + " " + this.props.age}</p>; } }); var HelloUniverse = React.createClass({ getInitialState: function () { return {name: "Yvette",age: "25"}; },render: function () { return( <div> <HelloWorld {...this.state}></HelloWorld> <input type = "text" onChange = {this.handleChange}/> </div> ) } }); ReactDOM.render(<HelloUniverse></HelloUniverse>,document.querySelector("#example")); </script>

运行结果如下,使用{…this.state}展开

第三种方法调用react提供的setProps函数
setProps接收的参数是一个对象,但是react不推荐改变组件的属性,可以通过父组件向子组件传入的方式。

<body>
    <div id = "example"></div>
</body>
</html>
<script src="build/react.js"></script>
<script src="build/react-dom.js"></script>
<script src="build/browser.min.js"></script>
<script type="text/babel"> var HelloWorld = React.createClass({ render: function(){ return <p>Hello,{this.props.name}</p> } }); var instance = ReactDOM.render(<HelloWorld></HelloWorld>,document.querySelector("#example")); instance.setProps({name: "William"}); </script>

使用setProps修改属性值,此种方式不推荐,如果需要改变属性值,可以参考第一个例子,利用父组件去修改

状态的含义和用法

state
状态:事物所处的状况。
状态是由事物自行处理、不断变化的。
状态是事物的私有属性
状态的用法
getInitialState:初始化每个实例特有的状态
setState:更新组件状态
使用setState——启用diff算法——有变化,更新DOM

属性和状态的对比

属性和状态的相似点
1、都是纯JS对象
2、都会触发render更新
3、都具有确定性
状态只和组件本身相关,组件不能修改属性

组件在运行时需要修改的数据就是状态。

属性和状态的实例

编写一个简单的文章评论
第一步:分析构成项目的组件
第二步:分析徐俊的关系和数据传递
第三步:编写代码
第一步:分析构成项目的组件
评论
内容
第二步:分析徐俊的关系和数据传递
评论框是内容的父组件
父组件需要传递评论对象子组件,评论对象是内容组件的属性评论内容内容组件的状态。

1、select,option是写死的
2、option的内容应该是动态的,将option的内容作为状态提取出来

利用属性和状态实现一个评论框:

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <Meta name="Keywords" content="关键词一,关键词二">
    <Meta name="Description" content="网站描述内容">
    <Meta name="Author" content="刘艳">
    <title>评论</title>
</head>
<body>
<div id = "example"></div>
</body>
</html>
<!--将option提取出来作为父组件的状态-->
<!--将评论对象(selectName)传递给子组件-->
<!--修改子组件,构建回复内容-->
<!--监听内容的变化,并将变化记录在状态中-->
<script src="build/react.js"></script>
<script src="build/react-dom.js"></script>
<script src="build/browser.min.js"></script>
<script type="text/babel"> var style = { width:300 + 'px',height:150 + 'px',marginTop:20+'px',marginBottom:20+'px',resize: 'none',textIndent:10 + 'px' }; 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" + this.state.inputText); },render: function () { return (<div> <textarea style = {style} onChange = {this.handleChange} placeholder = "please enter something..." ></textarea> <br/> <button onClick = {this.handleSubmit}>submit</button> </div>); } }); var Comment = React.createClass({ getInitialState: function () { return{ names: ["William","Yvette","Katharine"],selectName: "" }; },handleChange: 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.handleChange}> {options} </select> <Content selectName = {this.state.selectName}></Content> </div>); } }); ReactDOM.render(<Comment></Comment>,document.querySelector("#example")); </script>

需要注意的是,React中,style不能直接写300px,需要使用拼接,另外margin-top等也需要使用驼峰命名法,写成marginTop
运行结果如下:

猜你在找的React相关文章