首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在React中隐藏和显示文本

在React中隐藏和显示文本
EN

Stack Overflow用户
提问于 2016-11-10 14:32:38
回答 1查看 3.1K关注 0票数 1

我很难想明白这件事。我试图在我的一个组件中显示/隐藏文本,但是我不能这样做。我收到I was clicked!消息,所以我知道函数正在被传递。我遗漏了什么?

我是否还需要声明一个visibility CSS声明,也许这就是我所缺少的?

SnippetList.jsx

import React, { Component, PropTypes } from 'react'
import { createContainer } from 'meteor/react-meteor-data';
import Snippet from './snippet'
import { Snippets } from '../../../api/collections/snippets.js'


class SnippetList extends React.Component {
    constructor(props) {
        super(props);
        this.state = { visible: false }
        this.toggleVisible = this.toggleVisible.bind(this);
    }

    toggleVisible() {
        this.setState( { visible: !this.state.visible } )
        console.log('I was clicked');
    }

    renderSnippets() {

        return this.props.snippets.map( (snippet) => (
            <Snippet 
            key={snippet._id} 
            title={snippet.title}
            content={snippet.content}
            onClick={this.toggleVisible}
            />
        ));
    }

    render() {
        const snippets = Snippets.find({}).fetch({});

        return (
            snippets.length > 0 
            ?
            <ul>{this.renderSnippets()}</ul>
            : 
            <p>No Snippets at this time</p>
        )
    }   
}

SnippetList.propTypes = {
    snippets: PropTypes.array.isRequired,
}

export default createContainer(() => {
    Meteor.subscribe('snippets');

    return {
        snippets: Snippets.find({}).fetch()
    };
}, SnippetList);

Snippet.jsx

import React, { Component, PropTypes } from 'react'

export default class Snippet extends React.Component {

    render() {
        const visible = this.props.toggleVisible
        return (
            <article>
                <header>
                    <h1 className='Snippet-title'>{this.props.title}</h1>
                </header>
                <div className={visible ? 'show' : 'hidden'} onClick={this.props.onClick}>
                    <p className='Snippet-content'>{this.props.content}</p>
                </div>
            </article>
        )
    }
}

Snippet.propTypes = {
    title: PropTypes.string.isRequired,
    content: PropTypes.string.isRequired
    // toggleVisible: PropTypes.func.isRequired
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-10 15:25:54

问题是你没有通过隐藏部分作为道具。

在代码片段中,你做了const visible = this.props.toggleVisible,但是...toggleVisible不会传递给您的代码片段组件,因此它始终未定义

return this.props.snippets.map( (snippet) => (
    <Snippet 
    key={snippet._id} 
    title={snippet.title}
    content={snippet.content}
    onClick={this.toggleVisible}
    />
));

添加toggleVisible...也就是更改为这个。

return this.props.snippets.map( (snippet) => (
    <Snippet 
        key={snippet._id} 
        title={snippet.title}
        content={snippet.content}
        toggleVisible={this.state.visible}
        onClick={this.toggleVisible}
    />
));

你可能也应该把你的renderSnippets绑定到这个类上……意思是将此代码添加到构造函数this.renderSnippets = this.renderSnippets.bind(this);

现在来谈谈您的代码,为什么要将<ul>呈现为<article>的父级?ul的子类应该是一个<li>,我会重构你的组件,使其更像这样。

class SnippetList extends React.Component {
    constructor(props) {
        super(props);
        this.state = { visible: false };
        this.toggleVisible = this.toggleVisible.bind(this);
        this.renderSnippets = this.renderSnippets.bind(this);
    }

    toggleVisible() {
        this.setState( { visible: !this.state.visible } )
        console.log('I was clicked');
    }

    renderSnippets() {
        return this.props.snippets.map( (snippet) => (
            <Snippet 
                key={snippet._id} 
                title={snippet.title}
                content={snippet.content}
                toggleVisible={this.state.visible}
                onClick={this.toggleVisible}
            />
        ));
    }

    render() {
        const snippets = Snippets.find({}).fetch({});
        return (
            snippets.length > 0 
              ?  <ul>{this.renderSnippets()}</ul>
              :  <p>No Snippets at this time</p>
        )
    }   
}


export default class Snippet extends React.Component {
    render() {
        const {toggleVisible: visible} = this.props;
        return (
            <li>
                <article>
                    <header>
                        <h1 className="Snippet-title">{this.props.title}</h1>
                    </header>
                    <div onClick={this.props.onClick}>
                        <p className={visible ? 'show Snippet-content' : 'hidden Snippet-content'}>{this.props.content}</p>
                    </div>
                </article>
            </li>
        )
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40521269

复制
相关文章

相似问题

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