解决react不能往setState中传key作为参数的办法(文章最后实现了传递key做参数的办法)

   2023-03-08 学习力0
核心提示:读者朋友可以直接看最后一个分割线下面的那部分!利用方括号语法来动态的访问对象的属性,实现当参数为属性名的传递;有时候我们需要每次单独设置众多state中的一个,但是,都是进行相同的操作,这时候如果每个值都要单独写一个相同的函数的话,违背了don't re
读者朋友可以直接看最后一个分割线下面的那部分!利用方括号语法来动态的访问对象的属性,实现当参数为属性名的传递;
有时候我们需要每次单独设置众多state中的一个,但是,都是进行相同的操作,这时候如果每个值都要单独写一个相同的函数的话,违背了don't repeat yourself的原则,并给日后的维护埋下了极大的隐患。
这时我们就会想向上抽取,把每次不同的key传递给这个函数,就像下面这样:
this.state = {
  visibleA: false,
  visibleB: false,
  visibleC: false,
}
<button onClick={this.handleClick.bind(this, "visibleA")}>我想改变"visibleA"的值</button>
 
handleClick( key )  {
  this.setState({
    key :  true,
  });
}
但是因为key不能作为参数传递,然后会无效;因为我们传递给key的实际就是字符串
=================================================我是华丽的分割线==========================================================
然后经过思考,发现可以尝试使用数组的形式,方法如下
 
this.state = {
  //设置状态
  visibleAll: [false, false,false],
}
<button onClick = {this.handleClick.bind( this, 0 )}>    //这时候可以往里面传入数组下标,然后就实现了功能的复用
handleClick( i ) {
  let fooArr = this.state.visibleAll;   
  console.log( fooArr  === this.state.visibleAll )  //结果是:true,两个指向同一个实体;
  fooArr[ i ] = !fooArr[ i ];              //实现传入参数下标的值的更改;
  this.setState({                   //虽然不操作此步时,已经实现了this.state.visibleAll 的改变,但修改状态必须要通过setState修改,才会触发相关的render方法,实现视图的改变,所以这一步不能省
    visibleAll: fooArr,
  });
}
 
总结:然后不能传入key值,但是可以通过把需要操作的值放入一个数组中,这样我们就可以对整个数组中的一个值或者多个值,实现一个函数对其进行操作;实现复用功能。
=================================================我还是华丽的分割线======20170823修改====================================================
经过后续的工作,发现其实上面的那个方式有很多鸡肋,比如我们仅能通过  [ i ]  来表达参数,不能做到语义化;
所以,其实大部分可以使用直接传递值的方式,
  ex:  
-----------------------js-------------------
    handleClick(arg) {
      this.setState({ 
        visibleAll: arg,
      });
    }
-----------------------html-------------------
  <button onClick = {this.handleClick.bind( this, false )}>我能改变属性值为false</button>    //这时候可以往里面传入值,然后也可以实现复用,而且函数都时对特定对象的操作,功能更加单一
=================================================我还是华丽的分割线======20170828修改====================================================
终极总结:
  经过这几天的学习,发现了一个知识点:方括号语法来动态的访问对象的属性;
  即:果属性名是动态的(比如变量中),只能使用 [] 写法,而不能使用“点”语法访问
  所以,我们可以直接解决文章最开头抛出的问题,实现传递对象的key(属性名)的方式,实现方法的高通用性;
事例代码如下:
import React from 'react';
import HeaderCom_son from './header_1.js';

export default class HeaderCom extends React.Component {
   constructor(props) {
      super(props)
      this.state = {
         visibleA: false,
         visibleB: false,
         visibleC: false,
      }
   }
   handleClick(key) {
      this.setState((prevS,props)=>({
         [key]: !prevS[key]
      }));
   }
   render() {
      return (
         <div>
            <div >visibleA-----{this.state.visibleA.toString()}</div>
            <div >visibleB-----{this.state.visibleB.toString()}</div>
            <div >visibleC-----{this.state.visibleC.toString()}</div>
            <button onClick={this.handleClick.bind(this, "visibleA")}>我会执行this.handleClick.bind(this, "visibleA")</button>
            <button onClick={this.handleClick.bind(this, "visibleB")}>我会执行this.handleClick.bind(this, "visibleB")</button>
            <button onClick={this.handleClick.bind(this, "visibleC")}>我会执行this.handleClick.bind(this, "visibleC")</button>
         </div>
      );
   }
}

页面如下图:

解决react不能往setState中传key作为参数的办法(文章最后实现了传递key做参数的办法)

点击三个按钮分别都会改变对应的状态值;

实现仅仅需要一个方法,就可以改变所有状态的true / false 的切换 

其实再思考以下,我们可以再添加一个参数,

 <button onClick={this.handleClick.bind(this, "visibleA", "需要传递的值")}>
从而实现:一个方法,修改所有状态的属性,和所有值
到这里就很简单了,我就不再写了!
 
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • React实现基于Antd密码强度校验组件示例详解
    React实现基于Antd密码强度校验组件示例详解
    目录引言效果预览组件思想组件开发引言最近在开发 Nest 和 Umi 技术栈的个人项目,在用户管理模块需要用到一个密码强度校验组件,在网上寻找一方资料,没有找到自己想要的,特此自己造轮子!效果预览组件思想既然是密码强度校验,那么强度就必须有个梯度,这
    03-16
  • 03 React快速入门(三)——实现从一个输入框中添加完数据后此输入框内容清除的功能
    03 React快速入门(三)——实现从一个输入框中
    功能描述:      我们在一个输入框输入内容,然后点击添加按钮,此输入框的内容就会添加到页面上,但是此输入框中还存在上次输入的内容,我们想在每次输入添加完成之后,此输入框中的内容就会清除,如图:   实现思路:      我们可以先在输入框上定
    03-08
  • react编译器jsxTransformer,babel
    1.JSX是什么JSX其实是JavaScript的扩展,React为了代码的可读性更方便地创建虚拟DOM等原因,加入了一些类似XML的语法的扩展。2.编译器——jsxTransformerJSX代码并不能直接运行,需要将它编译成正常的JavaScript表达式才能运行,jsxTransformer.js就是这一编
    03-08
  • G2( bizCharts ) React 绘制混合图例
    G2( bizCharts ) React 绘制混合图例
     G2( bizCharts ) React 绘制混合图例,// data-set 可以按需引入,除此之外不要引入别的包import React from 'react';import { Chart, Axis, Tooltip, Geom, Legend, Label } from 'bizcharts';import DataSet from '@antv/data-set';// 下面的代码会被作为
    03-08
  • React-多页面应用 react怎么写页面
    React-多页面应用 react怎么写页面
    1初始化项目npm init create-react-app my-app2.修改indeximport React from 'react';import ReactDOM from 'react-dom';import './index.css';import App from './App';ReactDOM.render(App /, document.getElementById('root')
    03-08
  • react-native start 启动错误解决方法
    ERRORError watching file for changes: EMFILE{"code":"EMFILE","errno":"EMFILE","syscall":"Error watching file for changes:","filename":null}Error: Error watching file for changes: EMFILE
    03-08
  • React兄弟组件通信(发布者-订阅者模式)
    // eventProxy.js'use strict';const eventProxy = {onObj: {},oneObj: {},on: function(key, fn) {if(this.onObj[key] === undefined) {this.onObj[key] = [];}this.onObj[key].push(fn);},one: function(key, fn) {if(this.oneObj[key] === undefined) {thi
    03-08
  • React笔记_(7)_react路由 react路由配置
    路由路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程。路由器当然是作为一个转发设备出现的,主要是转发数据包来实现网络互联。那么react的路由到底指的是什么呢?举个栗子~~~在网页中点击后,从A页面跳到B页面,跳转过程中url发生变
    03-08
  • react-native关闭所有黄色警告 react native st
     将以下这两句话加在index.js(入口文件)中,放在AppRegistry.registerComponent('App', () = App)之前即可1 console.ignoredYellowBox = ['Warning: BackAndroid is deprecated. Please use BackHandler instead.','source.uri should not be an empty str
    03-08
  • react中style的写法 react styles
    div style={{width: 20px; height=30px}}style的写法/div 
    03-08
点击排行