原生js具有三种事件绑定方式: 行内事件绑定、使用on关键字进行事件绑定、使用addEventListener方法进行事件绑定
语法
<标签 onxxx='执行代码'>标签>
<div onclick="console.log('执行了')">点击div>
<div onclick="test1()">点击</div>
<script>
function test1(){
console.log('执行了')
}
</script>
原理
当触发事件时就会执行绑定的代码!!!若你绑定的是一段逻辑代码,触发事件直接执行逻辑代码; 若是方法的调用
,触发事件时是直接调用
该事件函数,this指向window。
语法
dom.onxxx = 函数
<div id="test">点击</div>
<script>
function test(){
console.log('执行了')
}
document.getElementById('test').onclick = test
</script>
原理
当事件被触发时,就会通过该dom元素调用绑定的方法,方法内部的this指向为 dom元素
语法
dom.addEventListener(事件类型,方法名,bol)
<div id="test">点击</div>
<script>
function test(){
console.log('执行了')
}
document.getElementById('test').addEventListener('click', test, false)
</script>
原理
当事件被触发时,就会通过该dom元素调用绑定的方法,方法内部的this指向为 dom元素
在react中这三种方式均支持,但是为了减少dom操作,更推荐使用行内方式
进行事件绑定
<标签 onXxx='方法名'></标签>
<div id="test"></div>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
class Test extends React.Component{
render(){
return <h1 onClick={this.test}>点击</h1>
}
test(){
console.log('执行了')
}
}
ReactDOM.render(<Test/>,document.getElementById('test'))
</script>
<div onclick="test1()">点击</div>
<script>
function test1(){
console.log('执行了')
}
</script>
return <h1 onClick={this.test}>点击</h1>
test(){
console.log('执行了')
}
</script>
函数体也是表达式,返回值为函数本身
) -> 得到test函数; return <h1 onClick={this.test()}>点击</h1>
test(){
console.log('执行了')
}
</script>
原生js事件绑定的值只有在事件被触发时才会执行
react中的事件绑定 会在render函数调用时被触发,函数的返回值才是函数被触发时执行的逻辑代码
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
class Mycomponent extends React.Component{
render(){
console.log(this) // 实例化对象
return <h1 onClick={this.test}>测试事件绑定</h1>
}
test(){
console.log(this) // undefined
}
}
ReactDOM.render(<Mycomponent />, document.getElementById('test111'))
</script>
undefiend
直接调用
该函数<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
class Mycomponent extends React.Component{
constructor(props){
super(props)
// 此处this指向了实例化对象
// 【1】 寻找test方法,在原型对象中找到test方法
// 【2】通过bind将方法的this指向修改为实例化对象(注:原型对象上的test方法的this还是指向undefiend)
// 【3】接收返回的方法并添加在实例化对象上
this.test = this.test.bind(this)
}
render(){
console.log(this) // 实例化对象
return <h1 onClick={this.test}>测试事件绑定</h1>
}
test(){
console.log(this)
}
}
ReactDOM.render(<Mycomponent />, document.getElementById('test111'))
</script>
<script type="text/babel">
class Mycomponent extends React.Component{
render(){
console.log(this) // 实例化对象
return <h1 onClick={this.test}>测试事件绑定</h1>
}
// 箭头函数本身没有this指向会通过作用于链寻找上一级的this指向
// 需要注意:通过赋值的方式的函数会添加在实例化对象上而不是原型对象上
test=()=>{
console.log(this) // 实例化对象
}
}
ReactDOM.render(<Mycomponent />, document.getElementById('test111'))
</script>