如何从另一个函数更改任何函数组件的状态?
How to change any function Component's state from another function?
React 16.8 将状态和 setState 功能引入基于函数的组件中。
我的问题是:
对于基于函数的组件,有什么方法可以在函数外更改状态吗?
示例:
import {useState} from 'react';
import Axios from 'axios';
function fetch_all_products(){
Axios.get(url)
.then(
response => {
let data = response.data;
//FROM HERE I WANT TO SET THIS DATA INTO SHOP COMPONENT
// STATE (i.e, products) AND RE RENDER THE SHOP COMPONENT
}
)
}
export default function Shop(){
const[products, setProducts] = useState(products['Rice','Oil']);
let all_products = products.map( product => {
return(
<li>product</li>
)
});
return(
<>
<h2>The Grocery Shop </h2>
<button onClick={fetch_all_products}>See All Products </button>
<ul>
{all_products}
</ul>
</>
)
}
我想使用 'fetch_all_products' 函数在函数外更改 Shop 组件的状态(产品)。
您可以使用 回调 来执行此操作。是这样的:
1.) 将回调传递给您的原始 fetch_all_products
函数。像这样:
function fetch_all_products(callback){
Axios.get(url)
.then(
response => {
let data = response.data;
callback(data);
}
)
}
2.) 创建一个 class 方法(class 中的函数),它将调用 fetch_all_products
并通过 onClick
调用此方法。像这样:
fetchProducts = () => {
fetch_all_products(data => {
// use the DATA here to set your state or modify it
}
}
3.) 通过 onClick
调用上述方法,如下所示:
<button onClick={fetchProducts}>See All Products </button>
你可以用其他方式做这样的事情,承诺将是你正在做的 api 调用,然后在响应到达时解析它并使用 setData 设置状态:
例子
const { useState } = React;
function fetchData() {
return new Promise(resolve => setTimeout(() => resolve(Math.random()), 500))
}
function App() {
const [data, setData] = useState(0)
function onClick() {
fetchData().then(setData)
}
return (
<div>
<button onClick={onClick}>Get data</button>
<div>{data}</div>
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<div id="root"></div>
最后我想出了一个简单的解决办法。
我在组件函数内部使用了它,而不是在组件函数之外使用基本函数('fetch_all_products'在'Shop'内部使用)。
[我的问题中有一个愚蠢的语法错误,这里也已更正]
代码:
import { useState } from 'react';
import Axios from 'axios';
export default function Shop() {
const [products, setProducts] = useState(['Rice', 'Oil']);
function fetch_all_products() {
Axios.get(url).then((response) => {
let data = response.data;
setProducts(data);
});
}
let all_products = products.map((product) => <li>{product}</li>);
return (
<>
<h2>The Grocery Shop </h2>
<button onClick={fetch_all_products}>See All Products </button>
<ul>{all_products}</ul>
</>
);
}
感谢所有试图以不同方式帮助我的人。
React 16.8 将状态和 setState 功能引入基于函数的组件中。
我的问题是:
对于基于函数的组件,有什么方法可以在函数外更改状态吗?
示例:
import {useState} from 'react';
import Axios from 'axios';
function fetch_all_products(){
Axios.get(url)
.then(
response => {
let data = response.data;
//FROM HERE I WANT TO SET THIS DATA INTO SHOP COMPONENT
// STATE (i.e, products) AND RE RENDER THE SHOP COMPONENT
}
)
}
export default function Shop(){
const[products, setProducts] = useState(products['Rice','Oil']);
let all_products = products.map( product => {
return(
<li>product</li>
)
});
return(
<>
<h2>The Grocery Shop </h2>
<button onClick={fetch_all_products}>See All Products </button>
<ul>
{all_products}
</ul>
</>
)
}
我想使用 'fetch_all_products' 函数在函数外更改 Shop 组件的状态(产品)。
您可以使用 回调 来执行此操作。是这样的:
1.) 将回调传递给您的原始 fetch_all_products
函数。像这样:
function fetch_all_products(callback){
Axios.get(url)
.then(
response => {
let data = response.data;
callback(data);
}
)
}
2.) 创建一个 class 方法(class 中的函数),它将调用 fetch_all_products
并通过 onClick
调用此方法。像这样:
fetchProducts = () => {
fetch_all_products(data => {
// use the DATA here to set your state or modify it
}
}
3.) 通过 onClick
调用上述方法,如下所示:
<button onClick={fetchProducts}>See All Products </button>
你可以用其他方式做这样的事情,承诺将是你正在做的 api 调用,然后在响应到达时解析它并使用 setData 设置状态:
例子
const { useState } = React;
function fetchData() {
return new Promise(resolve => setTimeout(() => resolve(Math.random()), 500))
}
function App() {
const [data, setData] = useState(0)
function onClick() {
fetchData().then(setData)
}
return (
<div>
<button onClick={onClick}>Get data</button>
<div>{data}</div>
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<div id="root"></div>
最后我想出了一个简单的解决办法。
我在组件函数内部使用了它,而不是在组件函数之外使用基本函数('fetch_all_products'在'Shop'内部使用)。
[我的问题中有一个愚蠢的语法错误,这里也已更正]
代码:
import { useState } from 'react';
import Axios from 'axios';
export default function Shop() {
const [products, setProducts] = useState(['Rice', 'Oil']);
function fetch_all_products() {
Axios.get(url).then((response) => {
let data = response.data;
setProducts(data);
});
}
let all_products = products.map((product) => <li>{product}</li>);
return (
<>
<h2>The Grocery Shop </h2>
<button onClick={fetch_all_products}>See All Products </button>
<ul>{all_products}</ul>
</>
);
}
感谢所有试图以不同方式帮助我的人。