如何获取组件CSS样式

来源:10-3 课程总结

见信

2020-08-25

最近看完react在写一个DEMO,实现一个双栏瀑布流视图,我的思路是,每次加载完一个item后,获取左边栏的高度与另一栏的高度进行比较,然后决定下个item添加到左边栏还是右边栏。然而现在在父组件中,我无法正确获取到两栏height,我要想能够获取组件样式该如何去做?

import React,{Component,Fragment} from 'react';
import ReactDOM from 'react-dom';
import CommunityItem from './components/CommunityItem'
import {CommunityCortainer,
        CommunityLeftWrap,
        CommunityRightWrap} from './style';
import { connect } from 'react-redux';
import { actionCreators } from './store';



class Community extends Component{
    constructor(props){
        super(props);
    }
    
    render(){
        return(
            <Fragment>    
                <CommunityCortainer>
                    <CommunityLeftWrap ref={(wrap)=>{this.leftWrap = wrap}}> 
                        {   
                            this.props.communityListData.map((item)=>{
                                return <CommunityItem key={item.id} data={item}/>
                            })
                        }
                    </CommunityLeftWrap>
                    <CommunityRightWrap ref={(wrap)=>{this.rightWrap = wrap}}>
                        {   
                            this.props.communityListData.map((item)=>{
                                return <CommunityItem key={item.id} data={item}/>
                            })
                        }
                    </CommunityRightWrap>
                </CommunityCortainer>
            </Fragment> 
        )
    }

    // 组件挂载完毕时
	componentDidMount() {
        this.props.changeCommunityData();
        console.log(this.leftWrap.clientHeight);
        console.log(this.rightWrap.clientHeight);
	}
}
// 从reduce获取数据到this.props中
const mapState = (state) => ({
    communityListData: state.getIn(['community', 'communityList'])
})

// 修改reduce中的数据
const mapDispatch = (dispatch) => ({

	// 改变communityList
	changeCommunityData() {
		dispatch(actionCreators.getCommunityList());
	}
});

export  default connect(mapState, mapDispatch)(Community);
import React,{Component} from 'react';
import ReactDOM from 'react-dom';
import {CommunityItemWrap,
        CommunityItemImg,
        CommunityItemTitle,
        CommunityItemNameWrapper,
        CommunityItemIcon,
        CommunityItemName} from './../style';

class CommunityItem extends Component{
    constructor(props){
        super(props);
    }
    
    render(){
        let data = this.props.data;
        return(
            <CommunityItemWrap ref={(item)=>{this.item = item}}>
                <CommunityItemImg src={data.img}></CommunityItemImg>
                <CommunityItemNameWrapper>
                    <CommunityItemIcon src={data.icon}></CommunityItemIcon>
                    <CommunityItemName>{data.username}</CommunityItemName>
                </CommunityItemNameWrapper>
                <CommunityItemTitle>{data.title}</CommunityItemTitle>
            </CommunityItemWrap>
        )
    }

    componentDidMount(){
        let itemNode = ReactDOM.findDOMNode(this.item);
        console.log(itemNode.offsetHeight);
    }
}

export default CommunityItem;

输出结果如图:
图片描述
我的item没有设置具体高度,只设置了max-height,本意是根据图片大小,自行决定item高度,width固定,不知道输出结果是否与此有关。
item样式如下:

export const CommunityItemWrap = styled.div`
    width:4.4rem
    max-height:5.733rem;
    margin:0.347rem auto 0 auto;
    background-color: yellow;
	box-shadow: 0 0 0.4rem 0 rgba(0, 0, 0, 0.14);
    border-radius: 0.134rem;
    overflow:hidden;
    position:relative;
`;  

使用ref获取的是否是虚拟DOM,使用findDOMNOde获取是否是真实DOM?我又该如何获取组件的CSS样式?

写回答

1回答

Dell

2020-09-01

使用ref获取的不是虚拟dom,是组件的引用。findDomNode 是真实dom,组件样式你用style-component 很难直接拿到

0
9
见信
回复
Dell
其实这里的重点是获取img 加载完成后的height,只是之前没做过瀑布流,对于这点不太清楚,一直想的都是为什么获取不到正确的item的height,毕竟实践才出真理嘛,只要拿到这玩意之后我才好去做定位。
2020-09-13
共9条回复

React零基础入门到实战,完成企业级项目简书网站开发

主流新技术 React-redux,React-router4,贯穿基础语法

5275 学习 · 2496 问题

查看课程