作为参数传递的 Javascript 函数未执行

Javascript function passed as parameter not executing

提问人:John Joyce 提问时间:10/25/2023 更新时间:10/25/2023 访问量:44

问:

我有一个 App.jsx,声明了一个常量和 setState 例程。我把 setState 放在一个函数 (update_word_list) 中。我将函数传递给一个子组件。console.log 将 typeof 参数打印为“函数”,函数本身的打印显示函数在子组件中被解释。该函数不执行。

我是 Javascript 的新手。如果我在做一些愚蠢的事情,我深表歉意(不用说......

下面有很多代码,所以我希望这描述了 WordsSample.jsx 中问题的本地化。概述/摘要操作:App.jsx

  1. 声明变量和 setState: const [word_list, setWord_List] = useState([“1”, “2”])
  2. 定义包含 setState 的函数(注意:console.log 作为第一个语句):function **Update_Word_List** (word_list) { console.log("Update word list inside app.js + word_list") setWord_List(word_list={word_list}) return (word_list) }
  3. 将匿名函数传递给子组件:<WordSample word_list={word_list} dowords={()=>Update_Word_List}/>

WordsSample.jsx

  1. 将 props 传递给 SendSample 函数 onClick: <button type=“submit” onClick={()=>SendSample(props)} name=“genwords” id=“genword”>Names
  2. 将道具接收到 SendSample、console.log typeof(识别为函数)和 function(识别为函数调用??):
function SendSample( props ) {
    console.log("Props value: " + typeof(props.dowords))
    console.log("Props value: " + props.dowords)

  1. 问题是什么!!尝试执行函数:props.dowords(strwords)。
  2. 本地化:console.log函数应该已经执行之后:console.log(“理论上我们已经完成了函数” + props.word_list) 笔记:
  • 该函数应该更改了初始props.word_list值,该值保持不变。
  • 函数调用是在从 axios.post 返回之后进行的。axios.post 已经工作,并提供了 200 http 返回,并且我有 console.log 以确保已返回数据。

控制台日志:

周边代码:

import './App.css';
import ControlS from './Controls'
import WordSample from './WordsSample'
import List_Words from './List_Words';
import {useState, useEffect} from 'react'


function App() {

  const [word_list, setWord_List] = useState(["1", "2"])

  function update_word_list (word_list)  {
    console.log("Update word list inside app.js  + word_list")
    setWord_List(word_list={word_list})
    return (word_list)
  }


  useEffect (() => {
    <App />
  }, []);
  

  
  return (
    <div className="App">
      <ControlS />
      <WordSample word_list={word_list} dowords={()=>update_word_list}/>
      <List_Words word_list={word_list}/>

Word_Sample子组件。笔记: 带有 props Word_sample调用函数 sendSample 中的按钮。

import React, {useEffect, useState} from 'react';
import endPoints from './api';
import axios from 'axios';

export default function WordSample(props) {

    let [sample, setWordSample] =  useState("")

    useEffect(() => {
        loadSample()
    }, [])

const loadSample = async () => {
    const data = await endPoints.sample();
    setWordSample(sample=data)
}


function sendSample( props ) {
    console.log("Props value: " + props.dowords)

    let send = {}
    send['words'] =  sample

    axios.defaults.headers.post['Access-Control-Allow-Origin'] = "*";

    axios.post('/genwords', send, {
         headers: {
           'Content-Type': 'application/json',
         }
       }).then(res => {
            // console.log("Response words:" + JSON.stringify(res.data))
            let strwords = JSON.stringify(res.data)
            strwords = strwords.split(",")
            props.dowords(strwords)
            console.log("In theory we have done the function" + props.word_list)

            // word_list.forEach((word, i)=>console.log(word))
       }).catch(err=>console.log("Error found:  " + err))

       return(
        <>
        <h2>Literal</h2>

        </>
       )

    }
    

    return (
        <div className="wordsample">
            
                <div className="ctlheader">
                    <h1>Word Sample</h1>
                </div>
                <p>Type (or paste) the word sample that you would like to generate sci-fi names from</p>
            <form id="form" method="POST">
                <textarea placeholder={sample} id="word" name="words" required
                onChange={(e)=>setWordSample(sample=e.target.value)}></textarea>
                <br />
                <button type="submit" onClick={()=>sendSample(props)} name="genwords" id="genword">Names</button>
            </form>                  
        </div>
    )
}
JavaScript 函数 onclick 参数传递 execute

评论

1赞 Jaromanda X 10/25/2023
dowords={()=>update_word_list}...那么,一个函数是返回函数的 - 它不运行它,只是返回它吗?也许你的意思是?dowordsupdate_word_listdowords={(...args)=>update_word_list(...args)}
0赞 John Joyce 10/25/2023
感谢您的快速回复!!我不太明白(对不起!!我想做的是从子函数运行update_word_list。sub 函数提供运行update_word_list所需的数据/参数。所以我想要:(1) dowords=function,正如你所说。(2)运行函数,从子函数返回其“定义”。我不会知道(...args) 当我定义 dowords 时。再次感谢!!对不起,如果我乱码了......
0赞 Jaromanda X 10/25/2023
你试过了吗?看,我本来打算建议,但我不做 reactjs,所以不知道这是否有效 - 但基本上是相同的功能......您将 dwords 设置为一个调用另一个函数的函数,传入所有 ... - 您可以用 ... 只是一个参数名称,所以你怎么称呼它无关紧要dowords={update_word_list}dowords={(...args)=>update_word_list(...args)}...args...pineapples...argsargs
0赞 John Joyce 10/25/2023
我确实尝试了一些关于你想法主题的变体。我仍然缺少如何执行update_word_list函数。我同意我似乎在传递一个指向它的“指针”,而不是可执行函数。再次感谢您的输入,但还没有完全到位。

答:

0赞 John Joyce 10/25/2023 #1

我已经破解了这个问题 - 并不完全令我满意。很简单,我直接传递 setState 函数:

我想我对以下问题感到困惑:

  1. 为什么这么多文档表明这是一个坏主意(这让我感到不舒服,它仍然是!!)。
  2. 为什么这与将任何其他函数作为参数传递不同......

所以还是有些神秘。如果我触底反弹,我会更新。现在:感谢您的帮助,我不希望其他人花时间在这件事上。特别感谢 https://stackoverflow.com/users/5053002/jaromanda-x!!