首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >样式组件中子组件输入焦点的样式父组件-组件

样式组件中子组件输入焦点的样式父组件-组件
EN

Stack Overflow用户
提问于 2017-08-30 13:55:28
回答 3查看 12.4K关注 0票数 4

我已经看到了解决这个问题的一些麻烦的解决方案,使用refs或事件处理程序进行反应。我想知道在样式组件中是否有一个解决方案。

下面的代码显然不正确。当我的输入子组件有焦点时,我正试图找出最简单的方式来对父组件进行样式设计。这有可能使用样式组件吗?

有什么最好的方法来解决这个问题,特别是考虑到样式组件,即使它意味着依赖上述的一种反应方法?

代码语言:javascript
复制
const Parent = () => (
  <ParentDiv>
    <Input/>
  </ParentDiv>
);


const ParentDiv = styled.div`
  background: '#FFFFFF';

  ${Input}:focus & {
    background: '#444444';
  }
`;

const Input = styled.input`
  color: #2760BC;

  &:focus{
    color: '#000000';
  }
`;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-12 22:42:55

看看:focus-within!我想这正是你要找的。

https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-within

票数 10
EN

Stack Overflow用户

发布于 2017-08-30 14:29:59

// update 2022:

你可以使用:focus-within (谢谢你找出@hoodsy)

代码语言:javascript
复制
div:focus-within {
  background: #444;
}
代码语言:javascript
复制
<div>
  <input type="text" />
</div>

support) //原始答案(带有IE和Edge )

遗憾的是,没有选择父级的方法,只基于带有纯CSS/样式组件的子级状态。虽然它是CSS4中的一个工作草案,但目前还没有浏览器支持它。More about this here

我通常在输入字段中添加一个onFocusonBlur属性,然后触发状态更改。在您的示例中,您有一个无状态组件。因此,可以使用innerRef从父类中添加或删除类。但我想你已经找到了这个解决方案。不过,我也会把它发出去:

代码语言:javascript
复制
const styled = styled.default;

const changeParent = ( hasFocus, ref ) => {
  // IE11 does not support second argument of toggle, so...
  const method = hasFocus ? 'add' : 'remove';
  ref.parentElement.classList[ method ]( 'has-focus' );
}

const Parent = () => {
  let inputRef = null;
  
  return (
    <ParentDiv>
      <Input
        innerRef={ dom => inputRef = dom }
        onFocus={ () => changeParent( true, inputRef ) }
        onBlur={ () => changeParent( false, inputRef ) }
      />
    </ParentDiv>
  );
};

const ParentDiv = styled.div`
  background: #fff;

  &.has-focus {
    background: #444;
  }
`;

const Input = styled.input`
  color: #2760BC;

  &:focus{
    color: #000;
  }
`;

ReactDOM.render( <Parent />, document.getElementById( 'app' ) );
代码语言:javascript
复制
<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>
<script src="https://unpkg.com/styled-components/dist/styled-components.min.js"></script>

<div id="app"></div>

更严格的方法是将Parent转换为类,这样就可以使用状态:

代码语言:javascript
复制
const styled = styled.default;

class Parent extends React.Component {
  state = {
    hasFocus: false,
  }
  
  setFocus = ( hasFocus ) => {
    this.setState( { hasFocus } );
  }
  
  render() {
    return (
      <ParentDiv hasFocus={ this.state.hasFocus }>
        <Input
          onFocus={ () => this.setFocus( true )  }
          onBlur={ () => this.setFocus( false ) }
        />
      </ParentDiv>
    );
  }
};

const ParentDiv = styled.div`
  background: ${ props => props.hasFocus ? '#444' : '#fff' };

`;

const Input = styled.input`
  color: #2760BC;

  &:focus{
    color: #000;
  }
`;

ReactDOM.render( <Parent />, document.getElementById( 'app' ) );
代码语言:javascript
复制
<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>
<script src="https://unpkg.com/styled-components/dist/styled-components.min.js"></script>

<div id="app"></div>

这样,您就可以更好地控制组件,并且可以更容易地决定将焦点/模糊状态传递给其他元素。

票数 4
EN

Stack Overflow用户

发布于 2018-07-29 18:08:02

@hoodsy谢谢,当输入集中时,它就像我下面在父div上使用的魅力一样,可以改变标签的颜色。

代码语言:javascript
复制
     &:focus-within label{
      color: blue;
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45962404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档