如何将react钩子绑定到jquery函数创建的元素

t1rydlwq  于 2023-02-08  发布在  jQuery
关注(0)|答案(2)|浏览(131)

我正在处理一个用jquery编写的项目,我想把这段代码集成到我的react项目中,我试图通过点击一个按钮向我的graphql服务器发送一个查询。
有一个JQ函数可以创建多个元素,如下所示:

canvas.append($(`<div class="d-flex flex-wrap my-2"><img class="else_picture" src="${elem.artworkUrl600}" height="150px"><div class="mx-2"><div class="elseTitle" id="${elem.trackId}">${elem.trackName}</div><h6>by:${elem.artistName}</h6><h6>keywords:</h6><p>${elem.genres}</p><div class="d-flex justify-content-start"><button value="${elem.feedUrl}" class="get_description"><a target="_blank" href="${elem.trackViewUrl}">Info link</a></i></button><div class="like_box"><i id="like" class="fa fa-thumbs-up"></div></div></div><hr>`)
    );

我的目标是将一个函数“onClick()”连接到这些创建的元素中的所有按钮,为此我尝试定义一个函数,它可以通过id查询所有元素,并将其连接到一个函数,该函数带有一个到我的graphql服务器的钩子:

function connectFunctionalityToLike(){
  $("#like").on("click", function(){ Like(this); });
}

function Like(x){
  console.log("clicked");

  const { loading, error, data } = useQuery(ME_QUERY);
    if (loading) return 'Loading...';
    if (error) return `Error! ${error.message}`;
  
    console.log(data);
  
}

我的函数Like()实际上不起作用,因为我不理解react中的元素实际上是如何与jquery一起工作的。我不能在JQuery中重写代码。我只想集成现有的代码。有没有办法将react钩子连接到通过id创建的元素?
有没有

9jyewag0

9jyewag01#

您应该为JQuery函数创建一个React组件 Package 器。
您必须手动管理React生命周期-通过在useEffect()回调中调用JQuery函数,并注意在清理中删除DOM元素:

function ReactWrapper() {
  const { loading, error, data } = useQuery(ME_QUERY);
  const [ data, setData ] = React.useState();
  React.useEffect(() => {
    jqueryFn();
    $('#like').on('click', function(){ setData('from click') });
    return () => {
       /* code that removes the DOM elements created by jqueryFn() */
    };
  }, []);

  if (loading) return 'Loading...';
  if (error) return `Error! ${error.message}`;

  return <div>{data}</div>;
}

然后,在这个React组件中,将允许使用钩子。
另外,如果JQuery函数非常简单,那么用React重写它可能会更好。

xoshrz7s

xoshrz7s2#

正如安迪在评论中所说:“You shouldn 't be mixing jQuery and React.”--但是,我们都曾处于别无选择的境地。如果您别无选择,只能使用jQuery沿着React,下面示例中的代码可能会有所帮助。
示例略有不同(没有画布等),但您应该能够看到您需要的内容。
这个示例超出了您的问题,并预测了下一个问题-“我如何访问和使用jQuery添加的[card、div、section等]中的数据?”
这是一个工作正常的StackBlitz EDIT -固定链接
请参见代码中的注解:

// jQuery Addition - happens outside the React App
$('body').append(
  $(`<div class="d-flex flex-wrap my-2"><img class="else_picture" src="${elem.artworkUrl600}" height="10px"><div class="mx-2"><div class="elseTitle" id="${elem.trackId}">${elem.trackName}</div><h6>by:${elem.artistName}</h6><h6>keywords:</h6><p>${elem.genres}</p><div class="d-flex justify-content-start"><button value="${elem.feedUrl}" class="get_description"><a target="_blank" href="${elem.trackViewUrl}">Info link</a></i></button><div class="like_box"><i id="like" class="fa fa-thumbs-up"></div></div></div><hr>`)
);

export default function App() {
  // state to hold the like data
  const [likes, setLikes] = useState([]);
  // create reference to the jquery element of importance
  // This ref will reference a jQuery object in .current
  const ref = useRef($('.elseTitle'));
  // Like function
  function Like(x) {
    // ref.current is a jQuery object so use .text() method to retrieve textContent
    console.log(ref.current.text(), 'hit Like function');
    setLikes([...likes, ' :: ' + ref.current.text()]);
  }
  // This is where you put
  useEffect(() => {
    // Add event listener and react
    $('#like').on('click', function () {
      Like(this);
    });
    // Remove event listener
    return () => $('#like').off('click');
  });
  return (
    <div>
      <h1>Likes!</h1>
      <p>{likes}</p>
    </div>
  );
}

相关问题