React父子组件传值

港控/mmm° 2022-11-17 03:50 322阅读 0赞

文章目录

      • 写在前面
        • 示例图1
        • 示例图2
        • 功能描述
        • 代码实现
        • 注意的点⚠️

写在前面

今天我们记录一下react的父子组件的传值,用到的还是比较多的,我们做一个简单的demo进行说明

示例图1

  • 没有数据的情况下显示形式
    在这里插入图片描述

示例图2

  • 有数据的情况显示形式
    在这里插入图片描述

功能描述

首先启动以后进入没有数据的view,然后我们输入任意字符,进行添加,会在下面NoData区域进行显示,鼠标放置上面的时候提示删除该项,鼠标点击,进行该项的删除!这里的两个组件分别是父组件包括input和button,子组件负责进行渲染添加的内容!具体逻辑已经写在了代码中可以自己看一下!

代码实现

  • 父组件

    /**

    • @author Clearlove
    • @aim 示例父子组件传值 - 父组件
    • @date 2021-04-08
    • @implements class extend React.Component
      */
      import React from ‘react’
      import Children from ‘./children’
      import ‘../common.css’
      class Father extends React.Component {
      // eslint-disable-next-line no-useless-constructor
      constructor(props) {
      1. super(props)
      2. this.currInput = React.createRef()
      3. this.state = {
      4. list: []
      5. }
      }
      render() {
      1. return (
      2. <div className="f-card">
      3. <div className="f-content">
      4. <input className="f-input" ref={this.currInput}></input>
      5. <button className="f-btn" onClick={() => this.addItem()}>添加</button>
      6. </div>
      7. <div className="f-child">
      8. <Children deleteCurrItem={() => this.deletedItem()} content={this.state.list} />
      9. </div>
      10. </div>
      11. )
      }
      /**
      • @function addItem 点击新加一个项到list中
        */
        addItem = () => {
        let tempArr = this.state.list
        if (this.currInput.current.value && this.currInput.current.value.length < 10) {
        1. if (tempArr.includes(this.currInput.current.value)) {
        2. alert("请不要输入重复元素!!!")
        3. } else {
        4. if (tempArr.length > 9) {
        5. alert("最多输入十条数据!!!")
        6. return false
        7. } else {
        8. tempArr.push(this.currInput.current.value)
        9. this.setState({
        10. list: tempArr
        11. })
        12. }
        13. }
        } else {
        1. alert("请输入合适的内容进行添加!!!")
        }
        }
        /**
      • @function deletedItem 根据下标进行list数组的删除
      • @param arg 数组的下标
        */
        deletedItem = (arg) => {
        let temparr = this.state.list
        temparr.splice(arg, 1)
        this.setState({
        1. list: temparr
        }, () => {
        1. console.log(this.state.list);
        })
        }
        }
        export default Father
  • 子组件

    /**

    • @author Clearlove
    • @aim 示例父子组件传值 - 子组件
    • @date 2021-04-08
    • @implements class extend React.Component
      */
      import React from ‘react’
      import ‘../common.css’
      class Children extends React.Component {
      // eslint-disable-next-line no-useless-constructor
      constructor(props) {
      1. super(props)
      }
      render() {
      1. return (
      2. <div>
      3. <ul className="item-ul">
      4. {this.props.content.length > 0 ? this.props.content.map((item, index) => <li title={"删除" + item} onClick={() => this.deleteCurrItem(index)} key={index}>{item}</li>) : <h2>No Data</h2>}
      5. </ul>
      6. </div>
      7. )
      }
      /**
      • @function deleteCurrItem 根据下标进行删除
      • @param {} arg /
        deleteCurrItem(arg) {
        //调用父组件中的函数进行执行删除的操作
        this.props.deleteCurrItem(arg)
        }
        }
        export default Children
  • App.js

这个文件可以自行设置渲染即可

  1. import Father from './components/jsx/father.jsx'
  2. import './App.css';
  3. function App() {
  4. return (
  5. <div className="App">
  6. <header className="App-header">
  7. <Father />
  8. </header>
  9. </div>
  10. );
  11. }
  12. export default App;
  • index.js

这个文件可以自行设置渲染即可

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import './index.css';
  4. import App from './App';
  5. import reportWebVitals from './reportWebVitals';
  6. ReactDOM.render(
  7. <React.StrictMode>
  8. <App />
  9. </React.StrictMode>,
  10. document.getElementById('root')
  11. );
  12. reportWebVitals();
  • css

    .f-card {

    1. width: 600px;
    2. height: 600px;
    3. background-color: blanchedalmond;
    4. display: flex;
    5. flex-direction: column;
    6. border: none;
    7. border-radius: 10px;
    8. padding-top: 20px;

    }

    .f-content {

    1. display: flex;
    2. flex-direction: row;
    3. justify-content: center;

    }

    .f-child {

    1. width: 600px;
    2. height: 500px;
    3. display: flex;
    4. flex-direction: column;
    5. justify-content: center;
    6. margin-top: 30px;

    }

    .item-ul {

    1. font-size: larger;
    2. color: chocolate;

    }

    .item-ul li {

    1. list-style: none;

    }

    .item-ul li:hover {

    1. color: black;
    2. cursor: move;
    3. font-size: 30px;

    }

    .f-btn {

    1. border: none;
    2. width: 120px;
    3. height: 40px;
    4. background-color: cadetblue;
    5. box-shadow: black;
    6. border-radius: 10px;
    7. font-size: 20px;
    8. color: aliceblue;
    9. text-align: center;
    10. line-height: 40px;
    11. margin-left: 10px;
    12. outline: none;
    13. cursor: pointer;

    }

    .f-input {

    1. width: 240px;
    2. height: 40px;
    3. border-radius: 10px;
    4. border: none;
    5. font-size: 20px;
    6. padding-left: 10px;
    7. color: dimgrey;
    8. outline: none;

    }

注意的点⚠️

1、父组件在引用子组件的时候,可以将自己在construsctor里面的定义的state里的值【就相当于vue中data里return的值】全部给子组件,使用…解构的形式或者直接给一个变量进行传递都是可以的
2、子组件在接收父组件的的值的时候React框架默认的是有一个props参数的,这个参数可以将引用你的那个组件想要给你的值全部包括在里面,不管什么格式,父组件给什么内容就可以直接接收到什么内容,当然也包括函数,上述例子中删除操作虽然在父组件中进行的,但是其实点击的还是子组件,所以说父组件是可以将函数作为参数传值给子组件的!
3、子组件给父组件值的时候是通过函数传递的,也就是说,vue中我们给父组件值是通过$emit()进行传递,这里是直接通过父组件定义的函数名字就可以!上述例子中deleteCurrItem函数就是父组件的函数,子组件只是引用了!

这是记录react学习中的父子组件传值!

发表评论

表情:
评论列表 (有 0 条评论,322人围观)

还没有评论,来说两句吧...

相关阅读