javascript - 如何在React中不相关组件的切换样式?
大家讲道理
大家讲道理 2017-04-10 16:01:13
[JavaScript讨论组]

在写React的时候发生了一个一个问题。

先说环境:react14.0 + Babel + gulp
显示的效果是这样的。

流程:
响应式页面,左侧茶色在大屏幕显示,小屏幕隐藏
左边和右边的完全独立,不是父子组建的关系。
而我想要通过点击触发器来修改左侧的css样式,进而达成隐藏显示的效果。

我应该在代码里面怎么写呢?

我做过一些想法的验证,然而没有效果:
全局函数,通过refs获取然后调整style
然而没办法生效,全局函数嘛,this.refsthis指向又是问题,因为两个组件没有任何联系。。。bind和call都试了,都是提示undefined

后来我想可以通过querySelector来找到样式直接操作dom的样式,这样确实是达成了效果,然而并不优雅,react貌似也并不推荐这么做。

希望有大神能给一下解决方法

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(3)
PHP中文网

HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>React</title>  
    <style>
        .left {
            background-color: darkslategray;
            float: left;
            width: 50%;
            height: 100px;
        }

        .left-other {
            background-color: green;
            float: left;
            width: 50%;
            height: 100px;
        }

        .right {
            background-color: deeppink;
            float: left;
            width: 50%;
            height: 100px;
        }
    </style>
</head>
<body>
<script src="js/lib/react.js"></script>
<script src="js/lib/JSXTransformer.js"></script>
<script src="js/my/app.js" type="text/jsx"></script>
</body>
</html>

Script

var Left = React.createClass({
    render: function () {
        return (
            <p className={this.props.leftClass}>
                我是想要被隐藏的
            </p>
        )
    }
});

var Right = React.createClass({
    handleClick: function () {
        this.props.toggleLeftClass();
    },
    render: function () {
        return (
            <p className="right">
                <button onClick={this.handleClick}>事件触发器</button>
            </p>
        )
    }
});

var App = React.createClass({
    getInitialState: function () {
        return {
            leftClass: 'left'
        }
    },
    toggleLeftClass: function () {
        this.setState({
            leftClass: this.state.leftClass === 'left' ? 'left-other' : 'left'
        })
    },
    render: function () {
        return (
            <p className="container">
                <Left leftClass={this.state.leftClass}/>
                <Right toggleLeftClass={this.toggleLeftClass}/>
            </p>
        )
    }
});    

React.render(<App />, document.body);

Effect

伊谢尔伦

其实这个是涉及到不同组件之间的数据传递的一个问题,有两个方法:

  1. 使用共同父组件传递数据的方法将子组件的数据传递给共同父组件然后通过父组件将值通过属性传入另外的子组件中。

  2. 使用外部数据 Store 来存储这个切换状态,组件内通过读取这个状态来修改样式

这两个方法都能做到尽量在数据层做操作而不涉及到 DOM。如果实在是要用 refs 的方法的话也建议在共同父组件中做,这样会更清楚一点。

阿神

可以简单到一个组件做$(document).trigger('anevent', data),另一个组件$(document).on('anevent', fn); 思想是让不想关的组件和一个中间人打交道。你也可以实现自己的pubsub或则某种形式的message queue。

参考:

https://facebook.github.io/react/tips/communicate-between-components.html

For communication between two components that don't have a
parent-child relationship, you can set up your own global event
system. Subscribe to events in componentDidMount(), unsubscribe in
componentWillUnmount(), and call setState() when you receive an event.
Flux pattern is one of the possible ways to arrange this.

https://facebook.github.io/flux/docs/dispatcher.html
http://ctheu.com/2015/02/12/how-to-communicate-between-react-components/#comp_to_comp

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号