绑定this并传参的三种方式

  1. 在事件中绑定this并传参:
    <input type="button" value="在事件中绑定this并传参" onClick={this.handleMsg1.bind(this, '', '')} />

    // 在事件中绑定this并传参
handleMsg1(arg1, arg2) {
console.log(this);
// 此时this是个null
this.setState({
msg: '在事件中绑定this并传参:' + arg1 + arg2
});
}
  1. 在构造函数中绑定this并传参:
    // 修改构造函数中的代码:
this.handleMsg2 = this.handleMsg2.bind(this, '', ''); <input type="button" value="在构造函数中绑定this并传参" onClick={this.handleMsg2} /> // 在构造函数中绑定this并传参
handleMsg2(arg1, arg2) {
this.setState({
msg: '在构造函数中绑定this并传参:' + arg1 + arg2
});
}
  1. 用箭头函数绑定this并传参:
    <input type="button" value="用箭头函数绑定this并传参" onClick={() => { this.handleMsg3('', '') }} />

    // 用箭头函数绑定this并传参
handleMsg3(arg1, arg2) {
this.setState({
msg: '用箭头函数绑定this并传参:' + arg1 + arg2
});
}

绑定文本框与state中的值

  1. 在Vue.js中,默认可以通过v-model指令,将表单控件和我们的data上面的属性进行双向数据绑定,数据变化和页面之间的变化是同步的!
  2. 在React.js中,默认没有提供双向数据绑定这一功能,默认的,只能把state之上的数据同步到界面的控件上,但是不能默认实现把界面上数据的改变,同步到state之上,需要程序员手动调用相关的事件,来进行逆向的数据传输!
  3. 绑定文本框和state的值:
    {/*只要将value属性,和state上的状态进行绑定,那么,这个表单元素就变成了受控表单元素,这时候,如果没有调用相关的事件,是无法手动修改表单元素中的值的*/}
<input style={{ width: '100%' }} ref="txt" type="text" value={this.state.msg} onChange={this.handleTextChange} /> // 这是文本框内容改变时候的处理函数
handleTextChange = () => {
this.setState({
msg: this.refs.txt.value
});
}
  1. 注意setState的一个问题
// 保存最新的state状态值,在保存的时候,是异步地进行保存的,所以,如果想要获取最新的,刚刚保存的那个状态,需要通过回掉函数的形式去获取最新state
this.setState({
msg: this.refs.txt.value
// msg: e.target.value
}, function () {
// 获取最新的state状态值
console.log(this.state.msg);
});

this问题和文本框

import React from 'react'

export default class BindThis extends React.Component {
constructor(props) {
super(props) this.state = {
msg: '这是默认的msg'
} // 绑定 this 并传参的方式2: 在构造函数中绑定并传参
// 注意,当为一个函数,调用 bind 改变了this指向后,bind 函数调用的结果,有一个返回值,这个值,就是被改变this指向后的函数的引用;
// 注意: bind 不会修改 原函数的 this 指向
this.changeMsg2 = this.changeMsg2.bind(this, '', '')
} render() {
return <div>
<h1>绑定This并传参的几种方式</h1> {/* bind 的作用: 为前面的函数,修改函数内部的 this 指向,让 函数内部的this,指向 bind 参数列表中的 第一个参数 */}
{/* bind 和 call/apply 之间的区别: */}
{/* call/apply 修改完this指向后,会立即调用前面的函数,但是 bind 只是修改this指向,并不会调用 */}
{/* 注意: bind 中的第一个参数,是用来修改 this 指向的,第一个参数后面的所有参数,都会当作将来调用 前面函数 时候的参数传递进去 */}
{/* 方式1:在 事件处理函数中,直接使用 bind 绑定 this 并传参 */}
<input type="button" value="绑定this并传参的方式1" onClick={this.changeMsg1.bind(this, '', '')} />
<input type="button" value="绑定this并传参的方式2" onClick={this.changeMsg2} />
{/* <input type="button" value="绑定this并传参的方式3" onClick={() => { this.changeMsg3('', '') }} /> */}
<input type="button" value="绑定this并传参的方式3" onClick={() => { this.changeMsg3('', '') }} /> <hr /> <h3>{this.state.msg}</h3> {/* 在 Vue 中,有 v-model 指令来实现双向数据绑定,但是,在 React 中, 根本没有指令的概念,因此React 默认也不支持 双向数据绑定 */}
{/* React 只支持,把数据从 state 上传输到 页面,但是,无法自动实现数据从 页面 传输到 state 中 进行保存,也就是,React 不支持数据的自动逆向传输, 只是实现了数据的单向绑定 */}
{/* 注意:如果为 表单元素,提供了 value 属性绑定,那么,必须同时为 表单元素 绑定 readOnly, 或者提供要给 onChange 事件 */}
{/* 如果提供了readOnly,表示这个元素只读的不能被修改 */}
{/* 如果提供了onChange 表示,这个元素的值可以被修改,但是,要自己定义修改的逻辑 */}
<input type="text" style={{ width: '100%' }} value={this.state.msg} onChange={this.txtChanged} ref="txt" />
</div>
} // 为 文本框 绑定 txtChanged 事件
txtChanged = (e) => {
// console.log('ok');
// 如果想让 文本框在触发 onChange 的时候,同时把文本框最新的值,保存到 state 中,那么,我们需要手动调用 this.setState // 获取文本框中 最新文本的3种方式:
// 1. 使用 document.getElementById 来拿
// 2. 使用 ref 来拿
// console.log(this.refs.txt.value);
// 3. 使用 事件对象的 参数 e 来拿 e.target 就表示触发 这个事件的 事件源对象,得到的是一个原生的JS DOM 对象
// console.log(e.target.value);
this.setState({
msg: e.target.value
})
} changeMsg1(arg1, arg2) {
// 注意:这里的方式,是一个普通方法,因此,在触发的时候,这里的 this 是 undefined
// console.log(this);
this.setState({
msg: '绑定this并传参的方式1' + arg1 + arg2
})
} changeMsg2(arg1, arg2) {
// console.log(this);
// 注意:这里的方式,是一个普通方法,因此,在触发的时候,这里的 this 是 undefined
this.setState({
msg: '绑定this并传参的方式2' + arg1 + arg2
})
} changeMsg3 = (arg1, arg2) => {
// console.log(this);
// 注意:这里的方式,是一个普通方法,因此,在触发的时候,这里的 this 是 undefined
this.setState({
msg: '绑定this并传参的方式3' + arg1 + arg2
})
} }

react-绑定this并传参的三种方式的更多相关文章

  1. React中使用 react-router-dom 路由传参的三种方式详解【含V5.x、V6.x】!!!

    路由传值的三种方式(v5.x) params参数 //路由链接(携带参数): <Link to='/demo/test/tom/18'}>详情</Link> //或 <L ...

  2. vue路由传参的三种方式以及解决vue路由传参页面刷新参数丢失问题

    最近项目中涉及到跨页面传参数和后台进行数据交互,看到需求之后第一反应就是用路由传参来解决:Vue中给我们提供了三种路由传参方式,下面我们一个一个的来看一下: 方法一:params传参: this.$r ...

  3. vue路由传参的三种方式区别(params,query)

    最近在做一个项目涉及到列表到详情页的参数的传递,网上搜索一下路由传参,结合自己的写法找到一种适合自己的,不过也对三种写法都有了了解,在此记录一下 <ul class="table_in ...

  4. 【service调用dao层传参的三种方式】

    第一种方案:默认数组角标: service Public User selectUser(String name,String area); mapper: <select id="s ...

  5. vue里面路由传参的三种方式

    1.方式一 通过query的方式也就是?的方式路径会显示传递的参数 HTML的方式<router-link :to="{name:xxx,query:{page:1,code:8899 ...

  6. Vue-router路由传参的三种方式

    本文简单介绍下三种路由传参: (1)在路由中配置 { path : ‘/home/:id’, name : ‘Dome’, component } 然后写调用的时候 this.$router.push ...

  7. vue路由传参的三种方式

    方式一 通过query方式传参 这种情况下 query传递的参数会显示在url后面 this.$router.push({ path: '/detail', query: { id: id } }) ...

  8. 3.struts2接收页面传参的三种方式

    Struts2通过拦截器机制封装了三种接收页面参数的方式: 1.属性驱动 2.模型驱动(有两种) Domain ModelDriven 1.属性驱动:这种方式比较简单,只要你直接在页面定义变量并且符合 ...

  9. React路由传参的三种方式

    方式 一:          通过params         1.路由表中                     <Route path=' /sort/:id '   component= ...

随机推荐

  1. [转]adbkey与adbkey.pub

    转载至:https://blog.csdn.net/caibaihui/article/details/46862591 error: device unauthorized. Please chec ...

  2. 安利自己写的easy-clipboard库

    概述 clipboard.js 是一个非常好用的剪切板插件,但是随着前端框架的演变,用户与网页交互的方式越来越多,不仅限于点击事件了,并且在很多情况下,我们可能不需要它强制性自带的点击事件,所以我打算 ...

  3. [Windows]远程管理服务WinRM远程管理Windows服务器 Invalid use of command line. Type "winrm -?" for help.

    运行环境 Windows 2012 R2 1. Windows需要打开WinRM服务,Server系统默认打开,默认端口5985 # WinRM服务查看 PS C:\Users\Administrat ...

  4. 加密算法极先锋之MD5算法

    在开发过程中,避免不了要涉及到数据加密,比如用户账号密码的加密,用户敏感数据的加密,涉及到的加密算法种类繁多,作为拿来主义的开发者时间精力有限,能够清楚其中主流的加密算法和用途,就已经足够了. 主要的 ...

  5. codewars--js--RGB To Hex Conversion

    问题描述: The rgb() method is incomplete. Complete the method so that passing in RGB decimal values will ...

  6. electron 安装过程出现未成功地运行

    问题 正文 产生问题得原因? 是因为之前安装了该程序,但是卸载的时候可能人为的直接删除了卸载程序. 这时候安装包会触发找到注册表中,该appid相同地址的卸载程序位置,然后进行调用,如果没有的话,只会 ...

  7. PPT导出为图片

    使用Aspose组件导出 Aspose有Aspose.Slides.dll,可以无需安装office,进行读写PPT文件. Aspose可能通过Aspose.Slides.NET安装 简单的导出图片d ...

  8. 如何利用border书写三角形,建议考虑正方形

    网页做三角形图片,你还在拿ps调整吗?out了,老铁,来和我一起脑海畅想一个正方形是由4个等腰直角三角形构成,然后我想保留上边的三角形,那下边.左边.右边的三角形就没了(设置背景色transparen ...

  9. HA: Chanakya Vulnhub Walkthrough

    靶机链接: https://www.vulnhub.com/entry/ha-chanakya,395/ 网络主机探测: 主机端口扫描: nmap -p- -sC -sV 10.10.202.136 ...

  10. 面试官:你用过mysql哪些存储引擎,请分别展开介绍一下

    这是高级开发者面试时经常被问的问题.实际我们在平时的开发中,经常会遇到的,在用SQLyog等工具创建表时,就有一个引擎项要你去选.如下图: Mysql的存储引擎有这么多种,实际我们在平时用的最多的莫过 ...