【问题标题】:Card component does not function properly卡组件无法正常工作
【发布时间】:2019-04-16 23:24:16
【问题描述】:

我有一个 react 组件,它显示了在 nextJs 上使用 antd 构建的用户数据和图像列表。反应没有按预期运行,所有反应和卡片都被一次性点击而不是单独点击。我想让每个反应和卡片组件都有其独特的点击,而不是一次全部点击。这里还有a link

import React from 'react';
import { Avatar, Card, Icon, List  } from 'antd';

import { ICON_LIST, LIST_TEXTS, STYLES, USER_UPLOAD } from './constants';

const { AVATAR, CARD_CONTAINER, ICON, USER_LIST } = STYLES;
const { INNER, MORE, UPLOAD, VERTICAL } = LIST_TEXTS

class Home extends React.Component {
state = {
    clicks: 0,
};
IncrementIconText = () => {
    this.setState({ clicks: this.state.clicks + 1 });
  }
render() {
    const actions = ( ICON_LIST.map(({ type }) => (
        <span>
            <Icon key={type} type={type} onClick={this.IncrementIconText} style={ICON} />
            {this.state.clicks}
        </span>
    )));
    return (
        <List
        itemLayout={VERTICAL}
        dataSource={USER_UPLOAD}
        renderItem={item => (
            <List.Item style={USER_LIST}>  
                <Card
                    actions={actions}
                    cover={<img alt={UPLOAD} src={item.image} />}
                    extra={<Icon type={MORE} />}
                    hoverable
                    title={<a><Avatar src={item.image} style={AVATAR} />{item.user}</a>}
                    type={INNER}
                    style={CARD_CONTAINER}
                >
                    {item.story}
                </Card>
            </List.Item>
        )}
        />
    );
}
}

export default Home;

constants.js

export const ICON_LIST = [
{
    key: "heart",
    type: "heart",
},
{
    key: "dislike",
    type: "dislike",
},

 {
    key: "meh",
    type: "meh",
},
]

export const LIST_TEXTS = {
INNER: "inner",
MORE: "more",
UPLOAD: "upload",
VERTICAL: "vertical",
};

export const STYLES = {
AVATAR: {
    marginRight: 8
},
CARD_CONTAINER: {
    width: "650px",
    marginBottom: 50
},
ICON: {
    marginRight: 8 
},
USER_LIST: {
    width: "100%",
    display: "flex",
    justifyContent: "center",
    alignItems: "center"
},
};

export const USER_UPLOAD = [
{
    image: "http://sugarweddings.com/files/styles/width-640/public/1.%20The%20Full%20Ankara%20Ball%20Wedding%20Gown%20@therealrhonkefella.PNG",
    story: "Today's my birthday next week! What do you think?",
    user: "Chioma",
},
{
    image: "https://dailymedia.com.ng/wp-content/uploads/2018/10/7915550_img20181007141132_jpeg01c125e1588ffeee95a6f121c35cd378-1.jpg",
    story: "Going for an event. Do you like my outfit",
    user: "Simpcy",
},
{
    image: "https://i0.wp.com/www.od9jastyles.com/wp-content/uploads/2018/01/ankara-styles-ankara-styles-gown-ankara-tops-ankara-gowns-ankara-styles-pictures-latest-ankara-style-2018-latest-ankara-styles-ankara-ankara-styles.png?fit=437%2C544&ssl=1",
    story: "Saturdays are for weddings. Yay or nay!",
    user: "Angela",
},
]

【问题讨论】:

    标签: javascript reactjs next.js


    【解决方案1】:

    现在每个图标上都有一个状态 (clicks)。对于每张卡片上的每个图标,这是相同的状态和相同的处理程序。

    要获得所需的功能,您需要为每个图标设置不同的计数。

    这是一个如何做到这一点的例子(我分叉了你的代码框):https://codesandbox.io/s/pyj2288l0

    此外,对于依赖于先前状态的状态更新,您应该使用this.setState((prevState) =&gt; {...})。这是因为状态更改可以是异步的,并且不能保证 this.state 是您所期望的。以下是有关您为什么需要它的文档:https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous

    【讨论】:

    • 在当前状态下,我可以点击任意次数,我还想确保一旦我点击一个元素中的一个图标,点击另一个图标会撤回前一个图标,双击会撤销什么被点击了
    • 您必须添加处理程序和业务逻辑才能做到这一点
    【解决方案2】:

    无论您点击哪个图标,您所做的只是增加“点击”的状态并将该状态应用于所有图标。这就是为什么每次点击时所有图标的点击次数都相同的原因。对于用户可以点击的每个单独的图标,应该有一个不同的“点击”状态计数器。

    【讨论】:

      【解决方案3】:

      您几乎已经准备好完成任务,您只需为每个图标添加计数器以分离状态并根据图标类型调用状态,一个小的实现可能是:

      import React from "react";
      import { Avatar, Card, Icon, List } from "antd";
      
      import { ICON_LIST, LIST_TEXTS, STYLES, USER_UPLOAD } from "./constants";
      
      const { AVATAR, CARD_CONTAINER, ICON, USER_LIST } = STYLES;
      const { INNER, MORE, UPLOAD, VERTICAL } = LIST_TEXTS;
      
      class Home extends React.Component {
        state = {
          clicks: 0,
          heartClicks: 0,
          dislikeClicks: 0,
          emojiClicks: 0
        };
      
        IncrementIconText = type => {
          if (type === "heart") {
            this.setState({ heartClicks: this.state.heartClicks + 1 });
          } else if (type === "dislike") {
            this.setState({ dislikeClicks: this.state.dislikeClicks + 1 });
          } else if (type === "meh") {
            this.setState({ emojiClicks: this.state.emojiClicks + 1 });
          }
        };
      
        render() {
          const actions = ICON_LIST.map(({ type }) => (
            <span>
              <Icon
                key={type}
                type={type}
                onClick={() => this.IncrementIconText(type)}
                style={ICON}
              />
              {type === "heart"
                ? this.state.heartClicks
                : type === "dislike"
                ? this.state.dislikeClicks
                : this.state.emojiClicks}
            </span>
          ));
          return (
            <List
              itemLayout={VERTICAL}
              dataSource={USER_UPLOAD}
              renderItem={item => (
                <List.Item style={USER_LIST}>
                  <Card
                    actions={actions}
                    cover={<img alt={UPLOAD} src={item.image} />}
                    extra={<Icon type={MORE} />}
                    hoverable
                    title={
                      <a>
                        <Avatar src={item.image} style={AVATAR} />
                        {item.user}
                      </a>
                    }
                    type={INNER}
                    style={CARD_CONTAINER}
                  >
                    {item.story}
                  </Card>
                </List.Item>
              )}
            />
          );
        }
      }
      
      export default Home;
      

      【讨论】:

      • 此解决方案将为每张照片上相同的所有图标提供相同的计数。即在一张照片上单击心脏将更新所有照片的心脏计数。
      猜你喜欢
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 2021-07-15
      • 2019-08-08
      • 2020-04-11
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多