gpt4 book ai didi

javascript - 我的表单上的 React 生成按钮不断刷新页面

转载 作者:IT老高 更新时间:2023-10-28 23:00:30 33 4
gpt4 key购买 nike

我试图使用 node.js 和 react.js 制作一个聊天应用程序,但我无法解决这个问题,每次单击我的页面按钮时它都会刷新页面。我对 Web 开发还很陌生,所以如果我的问题非常明显,请原谅我。我的代码可以在下面找到:

// Array of messages to be rendered
messageArray = [];
var socket = io();
// Prompt the user for their username
var user = prompt("Please enter your name", "Anonymous");
// Emit username information so that it can be kept track of
socket.emit('new user', user);


$('#chat').submit(function() {
// When the user hits submit, create a message object with
// information about their name, time sent, message, and socket id.
// The socket id will be filled on the server side
alert("hey");
var date = new Date();
var message = user + " (" + date.toLocaleTimeString('en-US') + "): " + $('#m').val();
var messageJSON = {text:message, username:user, id:"", time:date}
socket.emit('chat message', messageJSON);
// Reset the value field
$('#m').val('');
return false;
});

// On receiving a chat message, update messageArray and
// rerender the ViewingBox
socket.on('chat message', function(messages){
messageArray = [];
for (var i = 0; i < messages.length; i++) {
alert(messages[i].text)
messageArray.push(messages[i].text);
}

React.render(
<ViewingBox />,
document.getElementById('root')
);
});

// ViewingBox holds the view of the page and is updated whenever
// a new message is received
var ViewingBox = React.createClass({
render: function() {
return (
<div>
<h2>Global Chat: Logged in as {user}</h2>

<ul id="messages">
{messageArray.map(function(data, i) {
return (<li>{data}</li>)
})}
</ul>
<form id="chat" action="#">
<input id="m" autoComplete = "off" />
/*
*
Button in question
*
*/
<button>Send</button>
</form>
</div>
);
}
});


// Render the viewingBox when the page initially loads
React.render(
<ViewingBox />,
document.getElementById('root')
);

这是相关的 HTML:

<!doctype html>
<html>
<head>
<title>Socket.IO chat</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font: 13px Helvetica, Arial; }
form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
#messages { list-style-type: none; margin: 0; padding: 0; }
#messages li { padding: 5px 10px; }
#messages li:nth-child(odd) { background: #eee; }
</style>
</head>
<body>
<div id="root"></div>
<script src="https://fb.me/react-0.13.3.js"></script>
<script src="https://fb.me/JSXTransformer-0.13.3.js"></script>
<script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script type="text/jsx" src="/reactclient.js"></script>
</body>
</html>

由于某种原因,我的提交功能中的警报从未达到。每当我点击按钮时,它都会刷新页面。我不确定这是 React、jQuery 的问题,还是我的 HTML 遗漏了一些奇怪的东西。我已经尝试在我的按钮和 preventDefault() 中使用 'onsubmit = "return false"',但仍然无法查明问题。如何修复我的页面行为,我可以考虑使用哪些工具来更仔细地分析此问题?

最佳答案

这是默认的 HTML 行为。按钮默认为提交按钮,因此单击它们将提交表单。如果你不想这样,那就让它成为一个“哑”按钮:

<button type="button">Send</button>

您也可以简单地删除 <form>元素,因为您似乎没有对它做任何事情。


另一个问题是,如另一个答案中所述,您试图在按钮存在之前绑定(bind)事件处理程序。

混合使用 jQuery 和 React 的方式很困惑,使您的代码更难维护和推理。只需将所有内容保留在 React 组件中即可:

var ViewingBox = React.createClass({
getInitialState: function() {
return {
message: ''
};
},

_onMessageChange: function(event) {
this.setState({message: event.target.value});
},

_send: function() {
var date = new Date();
var message = user + " (" + date.toLocaleTimeString('en-US') + "): " + this.state.message;
var messageJSON = {text:message, username:user, id:"", time:date}
socket.emit('chat message', messageJSON);
// Reset the value field
this.setState({message: ''});
},

render: function() {
return (
<div>
<h2>Global Chat: Logged in as {user}</h2>

<ul id="messages">
{messageArray.map(function(data, i) {
return (<li>{data}</li>)
})}
</ul>
<form id="chat" action="#">
<input
value={this.state.message}
onChange={this._onMessageChange}
autoComplete="off"
/>
<button type="button" onClick={this._send}>Send</button>
</form>
</div>
);
}
});

同样,messageData应该是组件状态的一部分,但我把转换留给你。

基本上,您当前使用 React 的方式并没有给您带来太多好处。我建议阅读更多 React documentation , 特别是 Thinking in ReactInteractivity and Dynamic UIs .

关于javascript - 我的表单上的 React 生成按钮不断刷新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31039187/

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