我有两个输入,一个文本区域和三个标签。当输入或textarea位于焦点时,我想为标签上的某些动画添加一些类,但无法选择该特定标签。有没有办法做到这一点? 这是一个代码
<form onSubmit={this.handleSubmit}>
<div className="contact-form">
<div className="contact-form_group">
<label htmlFor="name" className={`contact-label name`}>
Ime
</label>
<input onChange={this.handleChange} onFocus={this.handleFocus} id="name" value={this.state.name} className="contact-form_input" type="text" name="name" />
</div>
<div className="contact-form_group">
<label htmlFor="email" className={`contact-label email`}>
Email
</label>
<input onChange={this.handleChange} onFocus={this.handleFocus} id="email" value={this.state.email} className="contact-form_input" type="email" name="email" />
</div>
<div className="contact-form_group">
<label htmlFor="message" className={`contact-label message`}>
Message
</label>
<textarea className="contact-form_textarea" id="message" cols="3" rows="8" onChange={this.handleChange} onFocus={this.handleFocus} value={this.state.msg} name="msg" />
</div>
<Button className="button" type="submit" children="Send" />
</div>
答案 0 :(得分:1)
如果您不担心浏览器的兼容性,则可以使用最先进的CSS选择器:focus-within
.contact-form > div:focus-within label
color: red
但是我实际上还不建议这样做。它仍然是工作草案的一部分,并未得到广泛支持。
在react中,您可以跟踪活动元素的名称,并有条件地将render类应用于标签。因此onFocus
/ onBlur
设置了focusedElement
,例如
onFocus(e) {
this.setState({focusedElement: e.currentTarget.getAttribute('name')})
}
然后在渲染中执行类似的操作
className={`contact-label name ${this.state.focusedElement === 'name' ? 'focused' : ''}`}
这是一个可行的示例-
class TodoApp extends React.Component {
constructor(props) {
super(props)
this.state = {
focusedElement: null
};
}
onFocus(e) {
this.setState({
focusedElement: e.currentTarget.getAttribute('name')
});
}
onBlur(e) {
this.setState({
focusedElement: null
});
}
render() {
return ( <
div >
<
label className = {
this.state.focusedElement === 'name' ? 'focused' : ''
} > Label For Name < /label> <
input name = 'name'
type = 'text'
onFocus = {
this.onFocus.bind(this)
}
onBlur = {
this.onBlur.bind(this)
}
/>
<
label className = {
this.state.focusedElement === 'other' ? 'focused' : ''
} > Label For Other Value < /label> <
input name = 'other'
type = 'text'
onFocus = {
this.onFocus.bind(this)
}
onBlur = {
this.onBlur.bind(this)
}
/> < /
div >
);
}
}
ReactDOM.render( < TodoApp / > , document.querySelector("#app"))
.focused {
color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
答案 1 :(得分:0)
如果输入/文本区域成为焦点,则无需添加类让CSS成为可能。 CSS可以为您解决这个问题。
input:focus {
background-color: 'red'; // or do some animation here
}
答案 2 :(得分:0)
您可以使用jquery npm install --save jquery
并使用jquery的addClass方法。
import $ from 'jquery'
.....
<form onSubmit={this.handleSubmit}>
<div className='contact-form'>
<div className='contact-form_group'>
<label htmlFor='name' className={`contact-label name`} id='l1' >Ime</label>
<input onChange={this.handleChange}
onFocus={()=>{$(#l1).addClass('classNameYouWantToAdd')}} id='name'
value={this.state.name}
className='contact-form_input'
type='text' name='name'/>
</div>
<div className='contact-form_group'>
<label htmlFor='email' className={`contact-label email`} id='l2'>Email</label>
<input onChange={this.handleChange}
onFocus={()=>{$(#l2).addClass('classNameYouWantToAdd')}} id='name'
id='email' value={this.state.email} className='contact-form_input' type='email' name='email'/>
</div>
<div className='contact-form_group'>
<label htmlFor='message' className={`contact-label message`}>Message</label>
<textarea className='contact-form_textarea' id='message' cols='3' rows='8' onChange={this.handleChange} onFocus={this.handleFocus} value={this.state.msg} name='msg'></textarea>
</div>
<Button className='button' type='submit' children='Send' />
</div>
</form>
答案 3 :(得分:0)
React没有一种类似于这种方式来处理嵌套子组件的非常有效的方法。处理特定节点/子节点样式的最佳方法是使用类,然后使用CSS进行适当的样式设置。
在您的情况下,您将执行以下操作:
.contact-form_input:focus {
background-color: #eee;
}
如果您想在悬停上添加一些样式或其他一些动画,可以通过类似的方式(使用CSS)来完成:
.contact-form_input:hover {
background-color: #aaa;
-webkit-animation: fadein 0.5s;
animation: fadein 0.5s;
}
像其他张贴者所建议的那样,将JQuery与ReactJS合并是不合适的。
答案 4 :(得分:0)
onFocus有一个React合成事件。您可以在焦点更改时更新状态,并更改每个输入的className。
<div className="form__group">
<label htmlFor="input1" className={focus === "input1" ? "focused__input" : "input"}>Input 1</label>
<input name="input1" onChange={this._onChange.bind(this)} onFocus={this._onFocus.bind(this, "input1")}/>
</div>
答案 5 :(得分:0)
您可以定义对该标签的引用,并专注于您可以使用来获取该标签的值
//定义对标签的引用
//获取焦点更改事件上的标签对象,并相应地更新标签的类 var object = this.refs.labelName;