簡體   English   中英

我怎樣才能讓我在 React.js 中的組件有一個單獨的行為?

[英]How i can do my component in React.js have a individual behavior?

我正在實現一個喜歡和不喜歡按鈕,我希望當我單擊它們時,它們將與其他 colors 一起使用,但只是單擊的組件,當我單擊所有按鈕時會更改 state,有人可以幫助我嗎?

`

const indexPost = async () => {
        const data = await api.get('/api/posts')
        if(data.data.length !=0){
            const dataArray = data.data
            if(dataArray.length === 0) {
                return
            }else{
                return(
                    setPost(dataArray.map( data => (
                        <Post key={data._id} id={data._id} title={data.title} text={data.text}>
                            <Like id={data._id}></Like>
                        </Post>
                        
                    )))
               )
         }
     }
           
} 




export default function Like({itemId}) {
    const context = useContext(notificationContext)
    const {isLoved, Like, Loved, Unlike, isLike, isUnlike, setIsLike, setIsUnlike, setIsLoved } = context
    return(
                <div className={styles.likeContainer} key={itemId}>
                            {isLike ? (
                            <button className={styles.likeContent} onClick={() => setIsLike(false)}><Icon.ThumbsUp className={styles.Icon} fill="#5CB0BB" ></Icon.ThumbsUp></button>) : 
                            (<button className={styles.likeContent} onClick={() => Like() }><Icon.ThumbsUp className={styles.Icon}  ></Icon.ThumbsUp></button>)}
                            {isLoved ? 
                            (<button className={styles.likeContent} onClick={() => setIsLoved(false)}><Icon.Heart className={styles.Icon}   fill="red" ></Icon.Heart> </button>) : 
                            (<button className={styles.likeContent} onClick={() => Loved() }><Icon.Heart className={styles.Icon}  ></Icon.Heart></button>)}
                            {isUnlike ? (
                            <button className={styles.likeContent} onClick={() => setIsUnlike(false)}><Icon.ThumbsDown className={styles.Icon}  fill="#702BA6"  ></Icon.ThumbsDown> </button>) : 
                            (<button className={styles.likeContent} onClick={() => Unlike()}><Icon.ThumbsDown className={styles.Icon}  ></Icon.ThumbsDown></button>
                            )}
                     </div>                
    )
};

我在我的項目中實現了類似的,它非常基礎,它顯示了如何更新喜歡,你需要處理用戶認證和東西的情況

應用程序.js

import { useState, useEffect, createContext, useReducer } from "react";
import { updateArrayOfObj } from "./utils";
import AllPosts from "./AllPosts";
export const PostsContext = createContext();

const initialState = {
  posts: [
    {
      _id: "1",
      name: "Browny",
      image: "http://placekitten.com/200/310",
      likes: 0,
      love: 0,
      dislikes: 0
    },
    {
      _id: "2",
      name: "Blacky",
      image: "http://placekitten.com/200/320",
      likes: 0,
      love: 0,
      dislikes: 0
    },
    {
      _id: "3",
      name: "SnowWhite",
      image: "http://placekitten.com/200/300",
      likes: 0,
      love: 0,
      dislikes: 0
    }
  ]
};

const reducer = (state, action) => {
  switch (action.type) {
    case "UPDATE_POST":
      return {
        ...state,
        posts: updateArrayOfObj(
          state.posts,
          action.payload.obj,
          "_id",
          action.payload._id
        )
      };
    case "CREATE_POST":
      return {
        ...state,
        posts: [...state.posts, ...action.payload.data]
      };
    case "DELETE_POST":
      return {
        ...state,
        posts: state.posts.filter((ele) => ele._id !== action.payload._id)
      };
    default:
      return state;
  }
};
export default function App() {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <PostsContext.Provider
      value={{
        state,
        dispatch
      }}
    >
      <div className="App">
        <AllPosts />
      </div>
    </PostsContext.Provider>
  );
}

PostsAll.js


import Post from "./Post";
import { PostsContext } from "./App";
import { useContext } from "react";

export default function AllPosts() {
  const { state } = useContext(PostsContext);
  return (
    <div className="allPosts">
      {state.posts.map((item) => {
        return (
          <Post
            name={item.name}
            image={item.image}
            likes={item.likes}
            love={item.love}
            dislikes={item.dislikes}
            id={item._id}
            key={item._id}
          />
        );
      })}
    </div>
  );
}


Post.js


import { PostsContext } from "./App";
import { useContext } from "react";

export default function Post(props) {
  const { state, dispatch } = useContext(PostsContext);
  const handleUserInteraction = (type, id) => {
    dispatch({
      type: "UPDATE_POST",
      payload: {
        obj: { [type]: props[type] + 1 },
        _id: id
      }
    });
  };
  return (
    <div className="post">
      <h3>{props.name}</h3>
      <img src={props.image} alt="cat" />
      <br />
      <button onClick={() => handleUserInteraction("likes", props.id)}>
        {props.likes} Like
      </button>{" "}
      <button onClick={() => handleUserInteraction("love", props.id)}>
        {props.love} Love
      </button>{" "}
      <button onClick={() => handleUserInteraction("dislikes", props.id)}>
        {props.dislikes} Dislike
      </button>
    </div>
  );
}


您可以參考此代碼框來實現相同的

編輯緊張之翼6f3nd

您可以在每個贊按鈕上使用 onClick() 並將其附加到 function,然后您可以使用 e.currentTarget.id 獲取該特定贊的值並以您想要的方式更改其 css/樣式。

const handleClick=(e)=>
    {
    console.log(e.currentTarget.id);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM