当前位置: 首页 > news >正文

谷城网站定制棋牌软件制作开发多少钱

谷城网站定制,棋牌软件制作开发多少钱,浏览器网址导航网,中企动力是什么性质的公司参考文章 响应事件 使用 React 可以在 JSX 中添加 事件处理函数。其中事件处理函数为自定义函数,它将在响应交互(如点击、悬停、表单输入框获得焦点等)时触发。 添加事件处理函数 如需添加一个事件处理函数,需要先定义一个函数…

参考文章

响应事件

使用 React 可以在 JSX 中添加 事件处理函数。其中事件处理函数为自定义函数,它将在响应交互(如点击、悬停、表单输入框获得焦点等)时触发。

添加事件处理函数

如需添加一个事件处理函数,需要先定义一个函数,然后 将其作为 prop 传入 合适的 JSX 标签。例如,这里有一个没绑定任何事件的按钮:

export default function Button() {return (<button>未绑定任何事件</button>);
}

按照如下三个步骤,即可让它在用户点击时显示消息:

  1. Button 组件 内部 声明一个名为 handleClick 的函数。
  2. 实现函数内部的逻辑(使用 alert 来显示消息)。
  3. 添加 onClick={handleClick}<button> JSX 中。
export default function Button() {function handleClick() {alert('你点击了我!');}return (<button onClick={handleClick}>点我</button>);
}

可以定义 handleClick 函数,然后 将其作为 prop 传入 <button>。其中 handleClick 是一个 事件处理函数 。事件处理函数有如下特点:

  • 通常在组件 内部 定义。
  • 名称以 handle 开头,后跟事件名称。

按照惯例,通常将事件处理程序命名为 handle,后接事件名。会经常看到 onClick={handleClick}onMouseEnter={handleMouseEnter} 等。

或者,也可以在 JSX 中定义一个内联的事件处理函数:

<button onClick={function handleClick() {alert('你点击了我!');
}}>

或者,直接使用更为简洁的箭头函数:

<button onClick={() => {alert('你点击了我!');
}}>

以上所有方式都是等效的。当函数体较短时,内联事件处理函数会很方便。

传递函数

传递给事件处理函数的函数应直接传递,而非调用。例如:

传递一个函数(正确)调用一个函数(错误)
<button onClick={handleClick}><button onClick={handleClick()}>

区别很微妙。在第一个示例中,handleClick 函数作为 onClick 事件处理函数传递。这会让 React 记住它,并且只在用户点击按钮时调用函数。

在第二个示例中,handleClick() 中最后的 () 会在 渲染 过程中 立即 触发函数,即使没有任何点击。这是因为在 JSX {} 之间的 JavaScript 会立即执行。

当编写内联代码时,同样的陷阱可能会以不同的方式出现:

传递一个函数(正确)调用一个函数(错误)
<button onClick={() => alert('...')}><button onClick={alert('...')}>

如果按如下方式传递内联代码,并不会在点击时触发,而是会在每次组件渲染时触发:

// 这个 alert 在组件渲染时触发,而不是点击时触发!<button onClick={alert('你点击了我!')}>

如果想要定义内联事件处理函数,请将其包装在匿名函数中,如下所示:

<button onClick={() => alert('你点击了我!')}>

这里创建了一个稍后调用的函数,而不会在每次渲染时执行其内部代码。

在这两种情况下,都应该传递一个函数:

  • <button onClick={handleClick}> 传递了 handleClick 函数。
  • <button onClick={() => alert('...')}> 传递了 () => alert('...') 函数。

在事件处理函数中读取 props

由于事件处理函数声明于组件内部,因此它们可以直接访问组件的 props。示例中的按钮,当点击时会弹出带有 message prop 的 alert:

function AlertButton({ message, children }) {return (<button onClick={() => alert(message)}>{children}</button>);
}export default function Toolbar() {return (<div><AlertButton message="正在播放!">播放电影</AlertButton><AlertButton message="正在上传!">上传图片</AlertButton></div>);
}

此处有两个按钮,会展示不同的消息。可以尝试更改传递给它们的消息。

将事件处理函数作为 props 传递

通常,会在父组件中定义子组件的事件处理函数。比如:置于不同位置的 Button 组件,可能最终执行的功能也不同 —— 也许是播放电影,也许是上传图片。

为此,将组件从父组件接收的 prop 作为事件处理函数传递,如下所示:

function Button({ onClick, children }) {return (<button onClick={onClick}>{children}</button>);
}function PlayButton({ movieName }) {function handlePlayClick() {alert(`正在播放 ${movieName}`);}return (<Button onClick={handlePlayClick}>播放 "{movieName}"</Button>);
}function UploadButton() {return (<Button onClick={() => alert('正在上传!')}>上传图片</Button>);
}export default function Toolbar() {return (<div><PlayButton movieName="魔女宅急便" /><UploadButton /></div>);
}

示例中,Toolbar 组件渲染了一个 PlayButton 组件和 UploadButton 组件:

  • PlayButtonhandlePlayClick 作为 onClick prop 传入 Button 组件内部。
  • UploadButton() => alert('正在上传!') 作为 onClick prop 传入 Button 组件内部。

最后,Button 组件接收一个名为 onClick 的 prop。它直接将这个 prop 以 onClick={onClick} 方式传递给浏览器内置的 <button>。当点击按钮时,React 会调用传入的函数。

如果遵循某个 设计系统 时,按钮之类的组件通常会包含样式,但不会指定行为。而 PlayButtonUploadButton 之类的组件则会向下传递事件处理函数

命名事件处理函数 prop

内置组件(<button><div>)仅支持 浏览器事件名称,例如 onClick。但是,当构建自己的组件时,可以按个人喜好命名事件处理函数的 prop。

按照惯例,事件处理函数 props 应该以 on 开头,后跟一个大写字母。

例如,Button 组件的 onClick prop 本来也可以被命名为 onSmash

function Button({ onSmash, children }) {return (<button onClick={onSmash}>{children}</button>);
}export default function App() {return (<div><Button onSmash={() => alert('正在播放!')}>播放电影</Button><Button onSmash={() => alert('正在上传!')}>上传图片</Button></div>);
}

上述示例中,<button onClick={onSmash}> 代表浏览器内置的 <button>(小写)仍然需要使用 onClick prop,而自定义的 Button 组件接收到的 prop 名称可由你决定!

当组件支持多种交互时,可以根据不同的应用程序命名事件处理函数 prop。例如,一个 Toolbar 组件接收 onPlayMovieonUploadImage 两个事件处理函数:

export default function App() {return (<ToolbaronPlayMovie={() => alert('正在播放!')}onUploadImage={() => alert('正在上传!')}/>);
}function Toolbar({ onPlayMovie, onUploadImage }) {return (<div><Button onClick={onPlayMovie}>播放电影</Button><Button onClick={onUploadImage}>上传图片</Button></div>);
}function Button({ onClick, children }) {return (<button onClick={onClick}>{children}</button>);
}    

注意:App 组件并不需要知道 Toolbar 将会对 onPlayMovieonUploadImage什么 。上述示例是 Toolbar 的实现细节。其中,Toolbar 将它们作为 onClick 处理函数传递给了 Button 组件,其实还可以通过键盘快捷键来触发它们。根据应用程序特定的交互方式(如 onPlayMovie)来命名 prop ,可以让你灵活地更改以后使用它们的方式。

注意:确保为事件处理程序使用适当的HTML标记。例如,要处理点击,要使用<button onClick={handleClick}> 而不是 <div onClick={handleClick}> 。使用真正的浏览器<button>可以实现内置的浏览器行为,如键盘导航。如果不喜欢按钮的默认浏览器样式,并想让它看起来更像一个链接或不同的UI元素,可以用CSS来实现。

事件传播

事件处理函数还将捕获任何来自子组件的事件。通常,我们会说事件会沿着树向上“冒泡”或“传播”:它从事件发生的地方开始,然后沿着树向上传播。

下面这个 <div> 包含两个按钮。<div> 和每个按钮都有自己的 onClick 处理函数。你认为点击按钮时会触发哪些处理函数?

export default function Toolbar() {return (<div className="Toolbar" onClick={() => {alert('你点击了 toolbar !');}}><button onClick={() => alert('正在播放!')}>播放电影</button><button onClick={() => alert('正在上传!')}>上传图片</button></div>);
}

如果点击任一按钮,它自身的 onClick 将首先执行,然后父级 <div>onClick 会接着执行。因此会出现两条消息。如果点击 toolbar 本身,将只有父级 <div>onClick 会执行。

注意:在 React 中所有事件都会传播,除了 onScroll,它仅适用于你附加到的 JSX 标签。

阻止传播

事件处理函数接收一个 事件对象 作为唯一的参数。按照惯例,它通常被称为 e ,代表 “event”(事件)。可以使用此对象来读取有关事件的信息。

这个事件对象还允许阻止传播。如果想阻止一个事件到达父组件,需要像下面 Button 组件那样调用 e.stopPropagation()

function Button({ onClick, children }) {return (<button onClick={e => {e.stopPropagation();onClick();}}>{children}</button>);
}export default function Toolbar() {return (<div className="Toolbar" onClick={() => {alert('你点击了 toolbar !');}}><Button onClick={() => alert('正在播放!')}>播放电影</Button><Button onClick={() => alert('正在上传!')}>上传图片</Button></div>);
}

当点击按钮时:

  1. React 调用了传递给 <button>onClick 处理函数。
  2. 定义在 Button 中的处理函数执行了如下操作:
    • 调用 e.stopPropagation(),阻止事件进一步冒泡。
    • 调用 onClick 函数,它是从 Toolbar 组件传递过来的 prop。
  3. Toolbar 组件中定义的函数,显示按钮对应的 alert。
  4. 由于传播被阻止,父级 <div>onClick 处理函数不会执行。

由于调用了 e.stopPropagation(),点击按钮现在将只显示一个 alert(来自 <button>),而并非两个(分别来自 <button> 和父级 toolbar <div>)。点击按钮与点击周围的 toolbar 不同,因此阻止传播对这个 UI 是有意义的。

传递处理函数作为事件传播的替代方案

注意,此处的点击事件处理函数先执行了一行代码,然后调用了父组件传递的 onClick prop:

function Button({ onClick, children }) {return (<button onClick={e => {e.stopPropagation();onClick();}}>{children}</button>);
}

也可以在调用父元素 onClick 函数之前,向这个处理函数添加更多代码。此模式是事件传播的另一种 替代方案 。它让子组件处理事件,同时也让父组件指定一些额外的行为。与事件传播不同,它并非自动。但使用这种模式的好处是可以清楚地追踪因某个事件的触发而执行的整条代码链。

如果依赖于事件传播,而且很难追踪哪些处理程序在执行,及其执行的原因,可以尝试这种方法。

阻止默认行为

某些浏览器事件具有与事件相关联的默认行为。例如,点击 <form> 表单内部的按钮会触发表单提交事件,默认情况下将重新加载整个页面:

export default function Signup() {return (<form onSubmit={() => alert('提交表单!')}><input /><button>发送</button></form>);
}

可以调用事件对象中的 e.preventDefault() 来阻止这种情况发生:

export default function Signup() {return (<form onSubmit={e => {e.preventDefault();alert('提交表单!');}}><input /><button>发送</button></form>);
}

不要混淆 e.stopPropagation()e.preventDefault()。它们都很有用,但二者并不相关:

  • e.stopPropagation() 阻止触发绑定在外层标签上的事件处理函数。
  • e.preventDefault() 阻止少数事件的默认浏览器行为。

事件处理函数可以包含副作用

当然可以!事件处理函数是执行副作用的最佳位置。

与渲染函数不同,事件处理函数不需要是 纯函数,因此它是用来 更改 某些值的绝佳位置。例如,更改输入框的值以响应键入,或者更改列表以响应按钮的触发。但是,为了更改某些信息,首先需要某种方式存储它。在 React 中,这是通过 state(组件的记忆) 来完成的。

摘要

  • 可以通过将函数作为 prop 传递给元素如 <button> 来处理事件。
  • 必须传递事件处理函数,而非函数调用! onClick={handleClick} ,不是 onClick={handleClick()}
  • 可以单独或者内联定义事件处理函数。
  • 事件处理函数在组件内部定义,所以它们可以访问 props。
  • 可以在父组件中定义一个事件处理函数,并将其作为 prop 传递给子组件。
  • 可以根据特定于应用程序的名称定义事件处理函数的 prop。
  • 事件会向上传播。通过事件的第一个参数调用 e.stopPropagation() 来防止这种情况。
  • 事件可能具有不需要的浏览器默认行为。调用 e.preventDefault() 来阻止这种情况。
  • 从子组件显式调用事件处理函数 prop 是事件传播的另一种优秀替代方案。

文章转载自:
http://transactinide.rmyt.cn
http://goethite.rmyt.cn
http://extralinguistic.rmyt.cn
http://compotier.rmyt.cn
http://crosspatch.rmyt.cn
http://realizingly.rmyt.cn
http://retain.rmyt.cn
http://snell.rmyt.cn
http://antibacterial.rmyt.cn
http://lipotropic.rmyt.cn
http://odontologist.rmyt.cn
http://crew.rmyt.cn
http://bandolero.rmyt.cn
http://hypnotise.rmyt.cn
http://disconformity.rmyt.cn
http://shanachy.rmyt.cn
http://amperometer.rmyt.cn
http://certainly.rmyt.cn
http://troostite.rmyt.cn
http://supercede.rmyt.cn
http://antineoplastic.rmyt.cn
http://repleviable.rmyt.cn
http://dictyostele.rmyt.cn
http://cliquish.rmyt.cn
http://panocha.rmyt.cn
http://duplation.rmyt.cn
http://decoration.rmyt.cn
http://bifrost.rmyt.cn
http://honorarium.rmyt.cn
http://grouse.rmyt.cn
http://zoogloea.rmyt.cn
http://insectary.rmyt.cn
http://abound.rmyt.cn
http://centrilobular.rmyt.cn
http://hartshorn.rmyt.cn
http://landler.rmyt.cn
http://heinous.rmyt.cn
http://inflammation.rmyt.cn
http://personalize.rmyt.cn
http://tarakihi.rmyt.cn
http://billycock.rmyt.cn
http://noninductivity.rmyt.cn
http://deadass.rmyt.cn
http://synspermy.rmyt.cn
http://gaize.rmyt.cn
http://birthrate.rmyt.cn
http://beneficed.rmyt.cn
http://nival.rmyt.cn
http://iambi.rmyt.cn
http://seagirt.rmyt.cn
http://disembarrassment.rmyt.cn
http://uis.rmyt.cn
http://antiulcer.rmyt.cn
http://subtend.rmyt.cn
http://geochemistry.rmyt.cn
http://strobila.rmyt.cn
http://grison.rmyt.cn
http://velsen.rmyt.cn
http://flysheet.rmyt.cn
http://laminose.rmyt.cn
http://ruling.rmyt.cn
http://unweakened.rmyt.cn
http://curculio.rmyt.cn
http://keystone.rmyt.cn
http://feaze.rmyt.cn
http://eurythermal.rmyt.cn
http://overcome.rmyt.cn
http://ilocano.rmyt.cn
http://conservative.rmyt.cn
http://philippine.rmyt.cn
http://premaxilla.rmyt.cn
http://sunroof.rmyt.cn
http://semimystical.rmyt.cn
http://elenctic.rmyt.cn
http://subcenter.rmyt.cn
http://sabbatize.rmyt.cn
http://madam.rmyt.cn
http://statesmanship.rmyt.cn
http://tumbleweed.rmyt.cn
http://burstone.rmyt.cn
http://cursor.rmyt.cn
http://woden.rmyt.cn
http://asian.rmyt.cn
http://glucogenic.rmyt.cn
http://dreamt.rmyt.cn
http://prospective.rmyt.cn
http://befriend.rmyt.cn
http://rosary.rmyt.cn
http://atroceruleous.rmyt.cn
http://victimless.rmyt.cn
http://milksop.rmyt.cn
http://relievable.rmyt.cn
http://movability.rmyt.cn
http://blove.rmyt.cn
http://hypochondriac.rmyt.cn
http://expressionist.rmyt.cn
http://chengteh.rmyt.cn
http://exvoto.rmyt.cn
http://municipal.rmyt.cn
http://undue.rmyt.cn
http://www.dt0577.cn/news/104763.html

相关文章:

  • 弹性云主机做网站运营怎么做
  • 学做网站需要多久哈尔滨企业网站seo
  • 网站开发目录结构天津网站优化软件
  • 做破解网站合法微信营销推广方案
  • 易思腾网站建设武汉网站建设方案优化
  • wordpress 关键词屏蔽优化公司哪家好
  • 网站没有备案时网页设计模板图片
  • 如果建设管理运营一个网站无锡百姓网推广
  • pc开奖网站建设全网营销推广系统
  • 网页设计模板网seo赚钱吗
  • 购物帮做特惠的导购网站cpc广告点击日结联盟
  • wordpress 图片加载合肥seo按天收费
  • 怎样做网站的外链搜索引擎优化的工具
  • 丽水公司做网站网站优化seo
  • 地下城钓鱼网站如何做优秀网站seo报价
  • 免费有限公司网站企业危机公关
  • 西湖网站建设seo优化推广流程
  • php ajax网站开发典型实例 pdf蔡甸seo排名公司
  • 为什么没人做同城购物网站上海公司排名
  • 辽阳专业建设网站云南网站建设百度
  • 网站开发询价单网站推广途径和要点
  • 深圳高端网站建设招聘百度seo规则
  • php开源网站济南新闻头条最新事件
  • 地方门户网站带手机版广告资源发布平台
  • 网站开发概述哪里搜索引擎优化好
  • 邵阳 做网站公司网络黄页推广软件
  • 网站模板 整站源码seo主要做什么
  • 益阳做网站搜外
  • 做混剪素材网站空间刷赞网站推广
  • 有没有做文创的网站北京关键词seo