gpt4 book ai didi

javascript - DOMContentLoaded 在导航后未触发,但在使用 javascript_pack_tag 时在页面重新加载时触发

转载 作者:行者123 更新时间:2023-12-04 12:40:47 25 4
gpt4 key购买 nike

我正在使用带有 React 和 Webpacker 的 Rails 6 rc1 项目。

我目前正在使用 javascript_pack_tag在我的 Rails 应用程序中呈现 React 组件。我试图不使用像 react-rails 这样的 gem 只是为了让事情变得简单。

今天我发现了一个奇怪的行为,即从链接导航到页面后我的 React 组件不会呈现。但是,在页面重新加载时,我的组件会被渲染。
Gemfile :

gem 'rails', '~> 6.0.0.rc1'
gem 'pg', '>= 0.18', '< 2.0'
gem 'puma', '~> 3.11'
gem 'sass-rails', '~> 5'
gem 'webpacker', '~> 4.0'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'bootsnap', '>= 1.4.2', require: false
gem 'devise', '~>4.6'

group :development, :test do
gem 'pry-byebug'
gem 'rspec-rails', '~> 3.8'
end

group :development do
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
app/views/layouts/application.html.erb :
<html>
<head>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
....
app/javascript/packs/application.js :
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

import "bootstrap"
import "../stylesheets/application"
app/views/posts/new.html.erb :
<%= content_tag :div,
id: 'post_data',
data: @post do %>
<% end %>
<div id="render_here"></div>
<%= javascript_pack_tag 'new_post' %>

app/javascript/packs/new_post.jsx : (虽然这个文件中的 React 代码与问题并不真正相关)
import React from 'react';
import ReactDOM from 'react-dom';
import PostForm from '../components/PostForm';

document.addEventListener('DOMContentLoaded', () => {
const node = document.getElementById('post_data');
const data = JSON.parse(node.getAttribute('data'));
const dom = document.querySelector('#render_here');

ReactDOM.render(
<PostForm post={data} />,
dom);
});

使用此设置,在单击导航到页面的链接后不会呈现组件。在页面重新加载时,组件被渲染。

我尝试了很多东西。

new_post.jsx , 将所有内容注释掉并仅留下 console.log(document.readyState) ,控制台显示 complete两次。在页面加载时,它显示 loading .

然后我尝试使用jQuery的 document.readynew_post.jsx :
$(document).ready(function() {
if (pageInitialized) {
return;
}
pageInitialized = true;

console.log('render');
...

再说一次, render页面导航到后显示两次。在页面重新加载时, render显示一次。

到底是怎么回事?

最佳答案

我知道这已通过解决方法为您解决,但我遇到了这个问题作为我搜索相同问题的第一个结果,因此为了将来有相同问题的其他人引用,我想留下一个解释。

如此处所述Rails 5: how to use $(document).ready() with turbo-links更好的方法是监听 turbolinks 事件。

document.addEventListener("turbolinks:load", ()=> {
alert("loaded");
}

或者如果你需要 jQuery

$( document ).on("turbolinks:load", ()=> {
alert("loaded");
}

CoffeScript 变体:

document.addEventListener "turbolinks:load",  ->
alert "loaded"

关于javascript - DOMContentLoaded 在导航后未触发,但在使用 javascript_pack_tag 时在页面重新加载时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56086445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com