当前位置: 首页 > 知识库问答 >
问题:

将类组件转换为函数组件时出错

郎志
2023-03-14

我试图将我的类组件转换为功能组件,但我的过滤器不再工作了。

主要的错误是当我想转换listProducts因为我不知道如何定义与useState为这种情况下的preState

如何能为情况更新状态?

这是我的密码

类组件

class ListShopping extends Component{
    constructor(props) {
        super(props);
        this.state = {
            size: "",
            sort: "",
            cartItems: [],
            products: [],
            filteredProducts: []
        };
    }
    componentDidMount() {
        fetch("http://localhost:8000/products")
            .then(res => res.json())
            .catch(err =>
                fetch("db.json")
                    .then(res => res.json())
                    .then(data => data.products)
            )
            .then(data => {
                this.setState({ products: data });
                this.listProducts();
            });
    }

    listProducts = () => {
        this.setState(state => {
            if (state.sort !== "") {
                state.products.sort((a, b) =>
                    state.sort === "lowestprice"
                        ? a.price < b.price
                        ? 1
                        : -1
                        : a.price > b.price
                        ? 1
                        : -1
                );
            } else {
                state.products.sort((a, b) => (a.id > b.id ? 1 : -1));
            }

            if(state.size !== ""){
                return {
                    filteredProducts: state.products.filter(
                        a => a.availableSizes.indexOf(state.size.toUpperCase()) >= 0
                    )
                }
            }
            return { filteredProducts: state.products };
        });
    };
    handleSortChange = e => {
        this.setState({ sort: e.target.value });
        this.listProducts();
    };
    handleSizeChange = e => {
        this.setState({ size: e.target.value });
        this.listProducts();
    };
    render() {
        return (
            <div className="container">
                <h1>E-commerce Shopping Cart Application</h1>
                <hr />
                <div className="row">
                    <div className="col-md-9">
                        <Filter
                            count={this.state.filteredProducts.length}
                            handleSortChange={this.handleSortChange}
                            handleSizeChange={this.handleSizeChange}
                        />
                        <hr />
                        <Products
                            products={this.state.filteredProducts}
                        />
                    </div>
                </div>
            </div>
        );
    }
} 

功能成分

const ListShopping = () => {
    const [data, setData] = useState({
        products : [],
        filteredProducts : [],
        sort : '',
        size : ''
    })

    const {products, filteredProducts, sort, size} = data;
    const fetchApi = () => {
        axios.get(`http://localhost:8000/products`)
            .then(response => response.data)
            .then(data => {
                setData({...data, products: data});
            })
    }

    const listProducts = () => {

    };
    const handleSortChange = e => {
        setData({...e, sort: e.target.value})
        listProducts();
    };
    const handleSizeChange = e => {
        setData({...e, size: e.target.value})
        listProducts();
    };

    useEffect(()=> {
        fetchApi()
    }, [])
    return(
        <div className="container">
            <h1>E-commerce Shopping Cart Application</h1>
            <hr />
            <div className="row">
                <div className="col-md-9">
                    <Filter
                        count={filteredProducts.length}
                        handleSortChange={handleSortChange}
                        handleSizeChange={handleSizeChange}
                    />
                    <hr />
                    <Products
                        products={filteredProducts}
                    />
                </div>
            </div>
        </div>
    )
}

共有2个答案

淳于飞鸾
2023-03-14

假设你有这样一个州

const [todos, setTodos] = useState([1,2,3,4,5,6,7]);

方法1:

现在,如果你想从这个钩子中获取prevState,试试这个方法

setTodos(oldTodo => {
                    oldTodo.push(1000);
                    setTodos(oldTodo)
                })

这个旧的TODO的工作方式与前一个状态的工作方式相同。

方法2:

const listProducts = () => {
        let oldState = todos
        //Now do what you want to do with it. modify the oldTodo
        setTodos(oldTodo);
    }

我更喜欢第二种方法,因为它给了我更多的灵活性来改变修改状态,如果你不能在第一种方法中正确地管理状态,或者如果它发现任何错误,那么它将返回未定义的状态,所以我更喜欢在一个临时变量和工作完成后设置它

陶宏浚
2023-03-14

试试这个

const listProducts = () => {
    setData(data => {
        if (data.sort !== '') {
            data.products.sort((a, b) =>
                data.sort === 'lowestprice'
                    ? a.price < b.price
                        ? 1
                        : -1
                    : a.price > b.price
                    ? 1
                    : -1,
            );
        } else {
            data.products.sort((a, b) => (a.id > b.id ? 1 : -1));
        }

        if (data.size !== '') {
            return {
                ...data,
                filteredProducts: data.products.filter(
                    a => a.availableSizes.indexOf(data.size.toUpperCase()) >= 0,
                ),
            };
        }

        return { ...data, filteredProducts: data.products };
    });
};
 类似资料:
  • 我有以下react功能组件来帮助支持react路由器所需的身份验证路由。 我需要将其从功能组件转换为类组件,以便利用React.component的componentDidMount方法。不幸的是,我很难弄清楚如何迁移它。如果我照原样做,我需要复制组件和…rest参数,但我不知道怎么做。我想我可以用这个.props.Component获得组件参数,但我不确定如何拉…rest。我是JSX和ES6的新

  • 我试图让用户从gallery中选择一幅图像,在imageView中显示它,同时创建同一文件的字节数组。 调试后: 'new File(filepath)'使用有效的文件系统路径执行没有问题。 但是它总是跳过'ByteArrayOutputStream baos=new ByteArrayOutputStream();'到带有java.ioFileNotFoundException的IOExcept

  • 我有一个应用程序正在使用类组件开发react,我发现了一个功能的代码,我想添加到我的代码中,但它是使用功能组件制作的。代码在这里https://codesandbox.io/s/framer-motion-animate-in-view-gqcc8 但相关部分是这样的。 我不知道如何在我的类组件中添加那个控件变量 我应该把它添加到我的州吗?我不明白如何让它在类组件中工作

  • 问题内容: 我在一个一维数组中有一个例子。它只会输出列。我的想法是使用2d数组选择行和列。这是我的代码: myfile.csv 输出: 名字蒂姆汤姆 问题答案: 我只是将split结果()添加到a中,如果您确实希望将其作为2d数组,则在事后将其转换。

  • 我是初学C#的,我想为学校创建一个计算器,但是在第45行出现了一个错误。错误消息:字符串长度必须正好为一个字符。我认为在拆分String数组然后另存为char数组之后会有一个错误。但我不知道为什么,也许是假的。 代码部分: 错误消息由char[]发送。 我想我有一个从字符串[]分裂的翻译错误

  • 问题内容: 注意: 这要求与通常的元组到数组的转换相反。 我必须将一个参数传递给(包装的c ++)函数作为嵌套元组。例如,以下作品 而以下 不 不幸的是,我想使用的参数是一个numpy数组。对于某些N,该阵列的尺寸始终为2xN,这可能会很大。 有没有简单的方法可以将其转换为元组?我知道我可以循环遍历,创建一个新的元组,但是如果numpy数组提供了一些不错的访问权限,我会更喜欢。 如果不可能如我所愿