【react基础】4、组件components的定义和传值

一、怎么定义一个组件。

组件分为无状态组件和类组件。
1、无状态组件

<div class="box"></div>
var App = ()=>{    //组件的首字母大写
	return <div>app component</div>
}
ReactDom.render(<App />,document.getElementById("box"))

注意坑:return后面不能随意给空格和换行,会报错。解决方法:把return的内容用小括号包裹。

2、类组件

	<div id="box"></div>	
	<script type="text/babel">
	     class App extends React.Component {
	     	  render(){
	     	  	  return <div>App component </div>
	     	  }
	     }
         ReactDOM.render(<App />,document.getElementById("box"))

注意:写法上,必须得有render函数,且render里面必须返回一个根元素,否则会报错。

二、父组件给子组件传值

1、无状态组件传值

	<div id="box"></div>	
	<script type="text/babel">
	     var list1 = ["aa","bb","cc"];
	     var list2 = ["js","jq","html"];
	     var list3 = ["orange","banana","apple"]
	     
		//定义一个list组件作为app组件的子组件
	      var List =(props)=>{  // props就是父组件传过来的值。
	      	  let {list} = props;  //结构赋值写法,等价于list = props.list
	      	  return <ul>
		      	  		 {
		      	  		 	list.map((item,index)=>{
		      	  		 		return <li key={index}>{item}</li>
		      	  		 	})
		      	  		 }
		      	  	 </ul>
	      }
	      
          var App = (props)=>{  //组件的首个字母大写
          	let {a,b,c,d}=props; // props就是父组件传过来的值。
          	console.log(a,b,c,d)
          	  return <div>app component 
          	  			<List list={list1} />  {/* list就是传给子组件的值 */}
          	  			<List list={list2} />
          	  			<List list={list3} />
          	  		</div>
          }
          
         var obj={a:1,b:2,c:3,d:4}
         // obj就是传给app这个组件的数据
         ReactDOM.render(<App {...obj} />,document.getElementById("box"))

2、类组件传值

	<div id="box"></div>	
	<script type="text/babel">
	     var list1 = ["aa","bb","cc"];
	     var list2 = ["js","jq","html"];
	     var list3 = ["orange","banana","apple"]
 
         class ShowList extends React.Component {
         	render(){
         		return <div>
         					<ul>
         						{
         							//类组件就是通过this.props来接收父组件传来的值
         							this.props.list.map((item,index)=>{  
         								return <li key={index}>{item}</li>
         							})
         						}
         					</ul>
         				</div>
         	}
         }
	     class App extends React.Component {
	     	  render(){
	     	  	  return <div>App component 
	     	  	    <ShowList list={list1} />  {/* list就是传给子组件的值 */}
	     	  	     <ShowList list={list2} />
	     	  	     <ShowList list={list3} />
	     	  	    </div>
	     	  }
	     }
        
         ReactDOM.render(<App />,document.getElementById("box"))

三、子组件给父组件传值

1、父组件写一个方法,把方法传给子组件
2、子组件向父组件传值 通过调用父组件方法传参

	<div id="box"></div>
	<script type="text/babel">
	        class Counter extends React.Component {
	        	constructor(props){
	        		super(props);
	        		this.state ={
	        			n: props.n 
	        		}
	        		//this.increment = this.increment.bind(this);
	        	}
	        	static defaultProps ={  // 默认的props的n值是20
	        		n:20
	        	}
	        	change(payload){  // payload 1 或 -1
	        		this.setState({
	        			n:this.state.n+payload
	        		},()=>{
	        			//子组件向父组件传值 调用父组件方法
	        			this.props.changeSum(payload);
	        		})
	        	}
	        	render(){
	        		return <div>
	        					<button onClick={this.change.bind(this,-1)}>-</button>
	        					 	{this.state.n} 
	        					<button onClick={this.change.bind(this,1)}>+</button>
	        				</div>
	        	}
	        }
			class App extends React.Component{
				constructor(props){
					super(props);
					this.arr = [1,2,3]; //计数器的初始值

					this.state ={
						sum : this.arr.reduce((a,b)=>a+b)
					}
					this.changeSum = this.changeSum.bind(this)
				}
				changeSum(n){ //n来自于 子组件 -1 或 -1
					this.setState({
						sum:this.state.sum +n
					})
				}
				render(){
					let {sum} = this.state;
					return <div>
							 {/*<Counter n={this.arr[0]} changeSum={this.changeSum} />
							 <Counter n={this.arr[1]}  changeSum={this.changeSum} />
							 <Counter n={this.arr[2]}  changeSum={this.changeSum} />*/}
							 {
							 	 this.arr.map((item,index)=>{
							 	 	 return  <Counter key={index} n={item}  changeSum={this.changeSum} />
							 	 })
							 }

							 {sum}
						</div>
				}
				
			}
			ReactDOM.render(<App />,document.querySelector("#box"));
	</script>

四、非父子组件传值

方法一:使用pubsub插件,这个插件用于父子组件传值(npm官网链接
发送数据:pubsub(“事件”,“数据”);
接收数据:pubsub.subscribe(“事件”,(事件,数据)=>{ console.log(数据) });

(1)安装插件

npm i pubsub-js

(2)引入pubsubJs

import pubsubJs from 'pubsub-js'

(3)使用pubsubJs
①发生数据

export default class componentName extends Component {
  send(){
    pubsubJs.publish("evt","haha");  //发送数据
  }
  render() {
    return (
      <div>
         <button onClick={this.send}>按钮</button>
      </div>
    )
  }
}

②接收数据

export default class componentName extends Component {
  constructor(props){
    super(props);
    pubsubJs.subscribe("evt",(evt,data)=>{     //接收数据
      console.log(data);
    })
  }
  render() {
    return <div className="two"></div>
  }
}

五、不传值的时候如何设置默认值,或者如何手动设置没有传值的报错

1、设置默认值
(1)短路运算

this.state = {
	n:this.props.n ||100
}

但这种方式有点low

(2)用static defaultProps(static是静态属性,表示不用实例。用类名就可以访问属性和方法)

static defaultProps = {
	// state的变量:你要设置的props的默认值
	n:20
}

2、设置报错,详见使用propTypes

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Hook是React 16.8版本引入的新特性,它可以让你在不编写class的情况下使用state以及其他的React特性。如果你想要在子组件中改变父组件的状态,可以通过在父组件定义一个函数,将这个函数作为props传递给子组件,然后在子组件中调用这个函数并传递需要改变的值。具体实现步骤如下: 1. 在父组件定义一个函数,用于改变父组件的状态。 2. 将这个函数作为props传递给子组件。 3. 在子组件中调用这个函数并传递需要改变的值。 下面是一个示例代码: ``` // 父组件 import React, { useState } from 'react'; import ChildComponent from './ChildComponent'; function ParentComponent() { const [parentState, setParentState] = useState('父组件状态'); const handleChildChange = (childState) => { setParentState(childState); }; return ( <div> <p>父组件状态:{parentState}</p> <ChildComponent onChange={handleChildChange} /> </div> ); } export default ParentComponent; // 子组件 import React, { useState } from 'react'; function ChildComponent(props) { const [childState, setChildState] = useState('子组件状态'); const handleChange = () => { props.onChange(childState); }; return ( <div> <p>子组件状态:{childState}</p> <button onClick={handleChange}>改变父组件状态</button> </div> ); } export default ChildComponent; ``` 在这个示例中,父组件定义了一个函数`handleChildChange`,用于改变父组件的状态。这个函数作为props传递给了子组件`ChildComponent`。在子组件中,当点击按钮时,调用`handleChange`函数,这个函数会调用父组件传递过来的`onChange`函数,并将子组件的状态`childState`作为参数传递给父组件。父组件中的`handleChildChange`函数会将子组件传递过来的状态`childState`设置为父组件的状态`parentState`,从而实现了子组件给父组件传值的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值